hdu6114Chess(组合数取余,逆元)

来源:互联网 发布:郑州大学软件技术学院 编辑:程序博客网 时间:2024/06/07 11:40

题意:

照着题目模拟一变,知道是求组合数,但是要取余。

思路:

需要用到逆元知识。从一个漂亮的学姐那抄了一份模板。

代码:

#include <iostream>using namespace std;typedef long long ll;const ll MOD = 1e9 + 7;     //  必须为质数才管用const ll MAXN = 1e5 + 3;int N, M;ll fac[MAXN];       //  阶乘ll inv[MAXN];       //  阶乘的逆元ll QPow(ll x, ll n){    ll ret = 1;    ll tmp = x % MOD;    while (n)    {        if (n & 1)        {            ret = (ret * tmp) % MOD;        }        tmp = tmp * tmp % MOD;        n >>= 1;    }    return ret;}void init(){    fac[0] = 1;    for (int i = 1; i < MAXN; i++)    {        fac[i] = fac[i - 1] * i % MOD;    }    inv[MAXN - 1] = QPow(fac[MAXN - 1], MOD - 2);    for (int i = MAXN - 2; i >= 0; i--)    {        inv[i] = inv[i + 1] * (i + 1) % MOD;    }}ll C(ll a, ll b){    if (b > a)    {        return 0;    }    if (b == 0)    {        return 1;    }    return fac[a] * inv[b] % MOD * inv[a - b] % MOD;}int main(int argc, const char * argv[]){    init();    int T;    cin >> T;    while (T--)    {        cin >> N >> M;        if (N == M)        {            cout << 1 << '\n';        }        else        {            cout << C(max(N, M),min(N, M)) << '\n';        }    }    return 0;}

原创粉丝点击