组合数打表

阶乘逆元

#define ll long long
const int maxn=1e5;
const int mod=1e9+7;

ll fac[maxn];
ll inv[maxn];
void inv_ini()
{
    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,mod);
    for(int i=maxn-2; i>=0; i--)
    {
        inv[i]=inv[i+1]*(i+1)%mod;
    }
}



次数多,范围小,空间少

// 预处理On,查询O1
ll fac[maxn]={1,1},inv[maxn]={1,1},f[maxn]={1,1};
ll c(ll a,ll b){//c(1,2),c(4,8)
    return fac[b]*inv[a]%mod*inv[b-a]%mod;
}
void init(){
    for(int i=2;i<maxn;i++){
        fac[i]=fac[i-1]*i%mod;
        f[i]=(mod-mod/i)*f[mod%i]%mod;
        inv[i]=inv[i-1]*f[i]%mod;
    }
}

            


次数少,代码少

// 查询On ll c(ll m,ll n){//c(1,2),c(3,4) ll ret=1; for(int i=1;i<=m;i++)ret=ret*(n-i+1)%mod*qpow(i,mod-2)%mod; return ret; }