Cod sursa(job #2856484)

Utilizator PopaMihaimihai popa PopaMihai Data 23 februarie 2022 22:08:57
Problema Combinari Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>

using namespace std;

const int MOD = 1e9 + 7;
const int NMAX = 1e6 + 1;


int q, nmax, n, k;
int fact[NMAX], inv_fact[NMAX];

int fastpow(int base, int exp)
{
    int b = base;
    int ans = 1;
    for(int i = 0; (1 << i) <= exp; i++) {
        if((1 << i) & exp)
            ans = (1LL * ans * b) % MOD;
        b = (1LL * b * b) % MOD;
    }

    return ans;
}

int comb(int N, int K)
{
    if(N < K)
        return 0;
    if(N == K)
        return 1;

    return (1LL * (1LL * fact[N] * inv_fact[K]) % MOD * inv_fact[N - K]) % MOD;
}

int main()
{
    cin >> nmax >> q;

    fact[0] = 1;
    for(int i = 1; i <= nmax; i++)
        fact[i] = (1LL * fact[i - 1] * i) % MOD;

    inv_fact[nmax] = fastpow(fact[nmax], MOD - 2);
    for(int i = nmax - 1; i >= 0; i--)
        inv_fact[i] = (1LL * inv_fact[i + 1] * (i + 1)) % MOD;

    int a, b;
    for(int i = 1; i <= q; i++)
        cin >> a >> b, cout << comb(a, b) << '\n';

    return 0;
}