반응형

[문제 개요]

nCr 이항 계수를 주어진 숫자로 나눈 나머지를 출력하시오.

각 문제마다 조건이 추가된다. 이 이항계수 시리즈는 수학적인 사고력을 높이고 특히 모듈러 연산에 대해 깊게 생각할 수 있게 해주는 문제들이다.

 

이항 계수 (1)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    private static long factorial(long n) {
        long result = 1;
        while(n > 1) {
            result = (result * n);
            n--;
        }
        return result;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        long N = Long.parseLong(st.nextToken());
        long R = Long.parseLong(st.nextToken());

        long first = factorial(N);
        long second = factorial(R) * factorial(N-R);

        System.out.println(first / second);
    }
}

 

이항 계수 (2)

이항 계수 (3)

+ 이항 계수 결과 값을 특정 숫자로 나누었을 때 나머지를 출력해야 한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    private final static long P = 1000000007;
    private static long factorial(long n) {
        long result = 1;
        while(n > 1) {
            result = (result * n) % P;
            n--;
        }
        return result;
    }
    private static long pow(long base, long exponent) {
        long result = 1;
        while (exponent > 0) {
            if (exponent % 2 == 1) {
                result *= base;
                result %= P;
            }
            base = (base * base) % P;
            exponent /= 2;
        }
        return result;
    }
    /*
    * [*] nCr mod P = n! / r! (n-r)! mod P
    * = n! * (r! * (n-r)!)^-1 mod P ( ※ 나눗셈에 대한 mod 연산은 없으므로 곱하기 연산으로 바꾸어 준다. )
    * = ( n! mod P * (r! * (n-r)!)^-1 mod P ) mod P ( ※ 곱셈에 대한 mod 연산으로 바꾸어 준다. )
    *
    * [*] 페르마 정리 a^p mod p = a mod p 응용하여 a mod p 의 역원 구하기
    * = a^p-1 mod p = 1 mod p ( ※ 양 쪽에 a^-1 를 곱하였다. )
    * = a * a^p-2 mod p = 1 mod p 이므로 a mod p 의 역원은 a^p-2 mod p 이다.
    *
    * = ( n! mod P * (r! * (n-r)!)^p-2 mod P ) mod P ( ※ a mod p 의 역원으로 바꾸어 준다. )
    * */
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        long N = Long.parseLong(st.nextToken());
        long R = Long.parseLong(st.nextToken());

        long first = factorial(N);
        long second = pow(factorial(R) * factorial(N-R) % P, P-2);

        System.out.println(first * second % P);
    }
}

 

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 10830 행렬 제곱 (Java)  (0) 2022.10.03
[BOJ] 9376 탈옥 (Java)  (0) 2022.10.02
[BOJ] 3197 백조의 호수 (Java)  (0) 2022.09.28
[BOJ] 1655 가운데를 말해요 (Java)  (0) 2022.09.28
[BOJ] 12865 평범한 배낭 (Java)  (0) 2022.09.27

+ Recent posts