
자연수 N 과 정수 K 가 주어졌을 때 이항 계수 C(N, K)를 1,000,000,007로 나눈 나머지를 구하는 프로그램을 작성
N이 최대 4,000,000이라 팩토리얼을 직접 나눌 수 없어서 모듈러 역원이 필요
a^(MOD-1) ≡ 1 (mod MOD) → a의 역원 = a^(MOD-2) mod MOD
a^(MOD-2)는 분할 정복 거듭제곱으로 O(log N)에 계산modPow(long a, long b) 참고
a^(-1) ≡ a^(MOD-2) (mod MOD)임의의 소수 p에 대해 p와 서로소인 어떤 수의 (p−1)제곱을 p로 나눈 나머지는 무조건 1이라는 정리
C(N, K) = fact[N] * pow(fact[K] * fact[N-K], MOD-2, MOD) % MODimport java.util.Scanner;
class Main {
static final long MOD = 1_000_000_007L;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int K = scanner.nextInt();
scanner.close();
System.out.println(solution(N, K));
}
static long solution(int N, int K) {
if (K < 0 || K > N) return 0;
long[] fact = new long[N + 1];
fact[0] = 1;
for (int i = 1; i <= N; i++) {
fact[i] = fact[i - 1] * i % MOD;
}
return fact[N] * modPow(fact[K], MOD - 2) % MOD
* modPow(fact[N - K], MOD - 2) % MOD;
}
static long modPow(long a, long b) {
long result = 1;
a %= MOD;
while (b > 0) {
if ((b & 1) == 1) result = (result * a) % MOD;
a = (a * a) % MOD;
b >>= 1; // b /= 2
}
return result;
}
}