组合数计算模板

  • mod为模数,maxn为最大值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int mod = 1e9+7;
const int maxn = 2e6+5;
ll  fac[maxn],inv[maxn];//储存除模后的阶乘和逆元的值

ll quickpow(ll m,ll n,ll k)// 快速幂return m^n % k
{
    ll b = 1;
    m = m%k;
    while (n > 0)
    {
          if (n & 1)
             b = (b*m)%k;
          n = n >> 1 ;
          m = (m*m)%k;
    }
    return b;
}
 
ll C(ll n, ll m)//计算组合数
{
    return (((fac[n] * inv[m])%mod) * inv[n-m]) % mod;
}

void init()//初始化
{
    fac[0] = 1;
    for(int i = 1; i<=maxn-2; i++)
        fac[i] = (i*fac[i-1])%mod;
    inv[maxn-2] = quickpow(fac[maxn-2],mod-2,mod);
    for(int i = maxn - 3; i>=0; i--)
        inv[i] = ( (i+1) * inv[i+1] ) % mod;
}

 

posted @ 2022-03-06 15:35  云憩风霞  阅读(144)  评论(0)    收藏  举报