求n以内的所有组合数
一种方法是根据组合数递推公式来算
先初始化,再 组合数的递推公式
,求出之后的
代码:
ll C[0] = 1;
for ( int i=1; i<k; i++ ) {
C[i] = (((n-i+1)*c[i-1])%mod*qpow(i,mod-2))%mod; ///注意及时取模和用逆元
}
还一种是根据组合数定义来算
, 预处理出n以内的阶乘及其逆元。
代码:
int C( int n, int m )
{
if ( n<m ) return 0;
int ans = ((a[n]*b[m])%mod*b[n-m])%mod;
return ans;
}
a[0]=a[1]=1;
for ( int i=2; i<=1003; i++ ) a[i]=(a[i-1]*i)%mod;
for ( int i=0; i<=1003; i++ ) b[i]=qpow(a[i],mod-2);
还有一种,如果只需要求一个C(n,m),可以O( n ) 求。和第一种差不多,只不过压缩到了一个函数里。
int C(int n, int m) //求 C(n, m)
{
int s = 1, c = 1;
for (int i = 1; i <= m; i+=1)
s = (s * i) %mod; //计算分母
for (int i = n - m + 1; i <= n; i++)
c = (c * i) % mod; //计算分子
return (c * qpow(s, mod - 2)) % mod; //求出值
}