728x90
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
final static long P = 1000000007;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
long N = Long.parseLong(st.nextToken());
long K = Long.parseLong(st.nextToken());
// 분자 N!
long numer = factorial(N);
// 분모 (K! * (N-K)!) mod p
long denom = factorial(K) * factorial(N - K) % P;
// N! * 분모의 역원((K! * (N-K)!)
System.out.println(numer * pow(denom, P - 2) % P);
}
public static long factorial(long N) {
long fac = 1L;
while(N > 1) {
fac = (fac * N) % P;
N--;
}
return fac;
}
public static long pow(long base, long expo) {
// 지수가 1일 경우 base^1 이므로 base % P를 리턴
if(expo == 1) {
return base % P;
}
// 지수의 절반에 해당하는 base^(expo / 2) 을 구한다.
long temp = pow(base, expo / 2);
/*
* 현재 지수가 홀 수 였다면
* base^(expo / 2) * base^(expo / 2) * base 이므로
* base를 한 번 더 곱해주어야 한다.
*
* ex) A^9 = A^4 * A^4 * A
*/
if(expo % 2 == 1) {
return (temp * temp % P) * base % P;
}
return temp * temp % P;
}
}
728x90
'CS > Algorithm' 카테고리의 다른 글
[백준 2749] 피보나치 수3 (0) | 2021.05.10 |
---|---|
[백준 1759] 암호만들기 - Java (0) | 2021.05.10 |
[백준 1759] 소수의 연속합 - JAVA (0) | 2021.05.10 |
[백준 10830] 행렬제곱 - java (0) | 2021.05.09 |
[백준:1697] 숨바꼭질 - JAVA (0) | 2021.05.03 |