문제 링크

http://icpc.me/13977

 

13977번: 이항 계수와 쿼리

\(M\)개의 자연수 \(N\)과 정수 \(K\)가 주어졌을 때 이항 계수 \(\binom{N}{K}\)를 1,000,000,007로 나눈 나머지를 구하는 프로그램을 작성하시오.

www.acmicpc.net

풀이

모듈러 역원에 대해 알아야 하는 문제다.

모듈러 역원에 대한 내용은 여기를 참고하자.

n!을 전처리하여 미리 구해두고, 각 쿼리마다 n! * ((n-r)! * r!)^(mod-2)을 구하면 된다.

이때 제곱은 분할정복을 이용하여 계산한다.

코드

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll mod = 1e9 + 7;
const int N = 4e6 + 6;
ll fac[N];

ll pw(ll a, ll b) {
    ll ret = 1;
    while (b) {
        if (b % 2) ret = ret * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ret % mod;
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    fac[0] = fac[1] = 1;
    for (int i = 2; i < N; i++) fac[i] = fac[i - 1] * i % mod;
    int m; cin >> m;
    while (m--) {
        int n, r; cin >> n >> r;
        ll a = fac[n], b = pw(fac[r] * fac[n - r] % mod, mod - 2); 
        cout << a * b % mod<< "\n";
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 1533 길의 개수  (0) 2022.02.03
[백준] 12850 본대 산책 2  (0) 2022.01.27
[백준] 9465 스티커  (0) 2022.01.25
[백준] 15824 너 봄에는 캡사이신이 맛있단다  (0) 2022.01.25
[백준] 2096 내려가기  (1) 2022.01.25
복사했습니다!