组合数

发布时间 2023-07-11 16:17:24作者: Qiansui

求解组合数

注意maxm的范围为C(n,m)中,n+m的最大取值。。。

int facinv[maxm + 10], fac[maxm + 10];
ll qpow(int b, int p, int k) {
    ll ans = 1, base = b;
    while(p) {
        if(p & 1) ans = ans * base % k;
        p >>= 1;
        base = base * base % k;
    }
    return ans % k;
}
ll C(ll n, ll m) {
    if(n < m) return 1;
    if(m*2>=n) m=n-m;
    return (ll)fac[n] * facinv[m] % mod * facinv[n - m] % mod;
}
facinv[0] = fac[0] = 1;
for(int i = 1; i <= maxm; i++)
	fac[i] = (ll)fac[i - 1] * i % mod;
for(int i = 1; i <= maxm; i++){
	facinv[i] = facinv[i - 1] * qpow(i, mod - 2, mod)%mod;
}

组合数递推公式 \(C_n^m=C_{n-1}^{m-1}+C_{n-1}^{m}\)

递推预处理组合数

void pre(){
	for(int i=1;i<=1000;++i){
		c[i][i]=c[i][0]=1;
		for(int j=1;j<i;++j){
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
		}
	}
	return ;
}

相关资料

求解组合数C(n,m)
https://blog.csdn.net/ZengAMing/article/details/63681754