Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(11402) 이항 계수 4 본문

백준 (C++)/Solve

(11402) 이항 계수 4

dh-winternagi 2026. 4. 28. 09:30

https://www.acmicpc.net/problem/11402

단계별로 풀어보기

56단계(수학 3) 1번째

 

 

이전에 제수가 소수인 경우에는 페르마의 소정리를 이용하여 이항 계수를 O(log M)에 구할 수 있었지만, 이 방법은 모듈러 연산이 된 팩토리얼 값이 필요해 O(N)의 전처리가 필요하다. 따라서 N의 값이 크다면 이 방법을 쓸 수 없다.

이럴 땐 뤼카의 정리를 써야 한다. N과 K를 M진법으로 나타냈을 때 n_1n_2...n_p(M)와 k_1k_2...k_p(M)가 된다고 하자. M진법 K의 자리수가 N의 자리수보다 작다면 앞쪽에 0을 붙여 자리수를 맞춰주면 된다. 이때 C(N, K) ≡ C(n_1, k_1)*C(n_2, k_2)*...*C(n_p, k_p) (mod M)가 성립한다. 만약 n_i<m_i라면 해당 이항 계수 값은 0이고 C(N, K)도 0이 된다.

 

 

 

#include <iostream>
using namespace std;
typedef unsigned long ul;

int power(int base, int expo, int p){
  int res= 1;
  base%= p;
  
  while(expo){
    if(expo&1)  res= (res*base)%p;
    base= (base*base)%p;
    expo/= 2;
  }
  
  return res;
}

int main() {
  int fac[2000]= {1, };
  long n, k, m, ans =1;

  cin >> n >> k >> m;

  for(int i=1;i<=m;i++){
    fac[i]= (fac[i-1]*i)%m;
  }
  
  while(n&&k){
    int nm= n%m, km= k%m;
    if(km>nm){
      ans= 0;
      break;
    }
    ans= (ans*fac[nm]*power((fac[km]*fac[nm-km])%m, m-2, m))%m;
    n/= m;
    k/= m;
  }

  cout << ans;

  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(13275) 가장 긴 팰린드롬 부분 문자열  (0) 2026.04.28
(5615) 아파트 임대  (0) 2026.04.28
(11111) 두부장수 장홍준 2  (0) 2026.04.28
(11493) 동전 교환  (0) 2026.04.28
(11409) 열혈강호 6  (0) 2026.04.28