풀이
Fermat’s little theorem을 기반으로 한 Lucas' theorem으로 풀이했다.
Lucas' theorem는 다음과 같다.
쉽게, nCk를 M으로 나눈 나머지를 구하기 위해서는
N과 K를 M진 전개해 얻은 각 자릿수의 조합끼리 곱하고 M으로 나누면 된다.
ex) input : 100 45 13
100 = 13*7 + 1*9
45 = 13*3 + 1*6
int result = 1;
while (N || K){
result = result*nCk(N%M, K%M, M) %M;
N /= M, K /= M;
}
nCk는 Fermat’s little theorem으로 구했다.
소스코드
#include <stdio.h>
int nCk(int N, int K, int M){
int A = 1, B = 1;
for (int i = N; i > N-K; i--)
A = A*i %M;
for (int i = K; i >= 2; i--)
B = B*i %M;
N = 1, K = M-2;
while (K){
if (K & 1) N = N*B %M;
K >>= 1;
B = B*B %M;
}
return A*N %M;
}
int main(){
long long N, K;
int M;
scanf("%lld %lld %d", &N, &K, &M);
int result = 1;
while (N || K){
result = result*nCk(N%M, K%M, M) %M;
N /= M, K /= M;
}
printf("%d", result);
}
출처 및 참고자료
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 19577] 수학은 재밌어 [C] (0) | 2021.08.30 |
---|---|
[백준 5615] 아파트 임대 [C] (0) | 2021.08.29 |
[백준 15791] 세진이의 미팅 [C] (0) | 2021.08.28 |
[백준 13977] 이항 계수와 쿼리 [C] (0) | 2021.08.28 |
[백준 16134] 조합 (Combination)[C] (0) | 2021.08.28 |