【總結】求組合數的方法

CN_swords發表於2017-07-29

對於求 C(n,m)%mod 的方法


1.   在n,m都不大時,可以利用楊輝三角直接求。

void C()
{
	for (int i=0;i<=500;i++)
		c[i][0]=1;
	for (int i=1;i<=500;i++){
		for (int j=1;j<=i;j++)
			c[i][j]=(c[i-1][j-1]+c[i-1][j]) % MOD;
	}
}

2.  利用公式 C(n,m) = m! /  (m-n)! / n!。

既然要%mod, 那麼兩個除數需要轉換成 * 其相應的逆元,可以用線性求逆元的方法在求 i! 的時候 求解  (i逆元)! 。

LL powz[N],inv[N],powinv[N];  
  
void init(){  
    powz[0] = 0; powz[1] = 1;  
    inv[0] = 0; inv[1] = 1;  
    powinv[0] = 0; powinv[1] = 1;  
    for(int i = 2; i < N; i++){  
        powz[i] = (powz[i-1]*(LL)i)%mod;  
        inv[i] = inv[mod%i]*(mod-mod/i)%mod;  
        powinv[i] = powinv[i-1]*inv[i]%mod;  
    }  
}  
LL C(int x, int y){  
    if(x == 0 || x == y)    return 1LL;  
    return powz[y]*powinv[y-x]%mod*powinv[x]%mod;  
}  
  

3. 。。。

相關文章