2种计算组合数的方法

时间:2021-03-24 18:32:46

1.求超大数组合取模

const int mod = 1e9+7;
const int maxn = 1e5+7;
typedef long long ll;
ll fac[maxn];
ll qpow(ll a,ll b)
{
ll ans=1;a%=mod;
for(ll i=b;i;i>>=1,a=a*a%mod)
if(i&1)ans=ans*a%mod;
return ans;
}
ll C(ll n,ll m)
{
if(m>n||m<0)return 0;
ll s1=fac[n],s2=fac[n-m]*fac[m]%mod;
return s1*qpow(s2,mod-2)%mod;
}


//主函数里:
fac[0]=1;
for(int i=1;i<maxn;i++)
fac[i]=fac[i-1]*i%mod;

2。杨辉三角简单暴力,打表

long long C[70][70];
void pre()
{
memset(C,0,sizeof(C));
for(int i=0;i<70;i++)
for(int j=0;j<=i;j++)
C[i][j]=1;
for(int i=2;i<70;i++)
for(int j=1;j<=i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];

}
//本方法运用了类似于杨辉三角的算法构造二维数组来等效组合数的求值