PS/Baekjoon Online Judge

[백준 11402] 이항 계수 4 [C]

kimyoungrok 2021. 8. 28. 11:47

백준 - 11402


풀이

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);
}

출처 및 참고자료

 

11402번: 이항 계수 4

첫째 줄에 \(N\), \(K\)와 \(M\)이 주어진다. (1 ≤ \(N\) ≤ 1018, 0 ≤ \(K\) ≤ \(N\), 2 ≤ \(M\) ≤ 2,000, M은 소수)

www.acmicpc.net

 

뤼카의 정리 - 위키백과, 우리 모두의 백과사전

뤼카의 정리(Lucas' theorem, -定理)는 수론과 조합론에서 이용되는 정리로, 프랑스인 수학자 에두아르 뤼카(Édouard Lucas)의 이름이 붙어 있다. 이 정리는 어떤 조합의 수를 소수 p에 대해 법 p 상에서

ko.wikipedia.org

 

[백준 11401] 이항 계수 3 [C]

풀이 A = N! - (N-K)!와 B = K!를 MOD로 나누며 구하고, 페르마의 소정리를 이용해 ( A* B^(MOD-2) )%MOD를 구하면 된다. 소스코드 #include const int MOD = 1e9+7; int main(){ long long N, K, A = 1, B = 1;..

kyr-db.tistory.com