求n以内的所有组合数

一种方法是根据组合数递推公式来算

先初始化C_{n}^{0} = 1,再 组合数的递推公式 C_{n}^{k} = \frac{n-k+1}{k}*C_{n}^{k-1},求出之后的C_{n}^{k}

代码:

1     ll Ck = 1;
2     for ( int i=1; i<k; i++ ) {
3         Ck = (((n-i+1)*now)%mod*qpow(i,mod-2))%mod; ///注意及时取模和用逆元
4     }
View Code

还一种是根据组合数定义来算

C_{n}^{m} = \frac{n!}{m!*(n-m)!} , 预处理出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);
View Code

 

posted @ 2020-04-29 21:07  才子佳人自是白衣卿相  阅读(69)  评论(0)    收藏  举报