알고리즘
[Java] 백준 11401번 이항 계수 3
J3SUNG
2023. 4. 6. 22:36
728x90
이항계수 문제입니다.
nCr로 입력받으며 이는 아래 코드로 구할 수 있습니다.
for (int i = 0; i < r; ++i) {
a *= (n - i);
b *= (r - i);
}
위의 코드에서 모듈러 연산을 추가해주어야 합니다.
그리고 구해진 값에서 a/b를 해야하는데
나눗셈을 하게 될 경우 모듈러 연산의 결과가 틀려지게 됩니다.
그래서 페르마 소정리를 통해서 계산해주었습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken());
long ans = 0;
int mod = 1000000007;
long a = 1;
long b = 1;
for (int i = 0; i < r; ++i) {
a *= (n - i);
b *= (r - i);
a %= mod;
b %= mod;
}
long b2 = 1;
int exp = mod - 2;
while(exp > 0) {
if(exp % 2 > 0) {
b2 *= b;
b2 %= mod;
}
b*=b;
b %= mod;
exp /=2;
}
ans = a * b2;
ans %= mod;
bw.write(ans + "\n");
bw.close();
}
}