组合数公式用C语言怎么算,求组合数C(m,n)的多种计算方法

https://ac.nowcoder.com/discuss/187813?type=101&order=0&pos=1&page=0

https://blog.csdn.net/shadandeajian/article/details/82084087

1.简单法---适合n,m很小

#includeusing namespacestd;const int MAXN = 1000;int C[MAXN+1][MAXN+1];//求排列组合数C(m,n) 上面为m,下面为n m//C(m,n)=n!/m!/(n-m)!=n*(n-1)*..*(n-m+1)/m!.

int baoli_C(int m,int n) //暴力法这里n<=15

{int summ=1,sumn=1;//其实算C(m,n)只要计算min(m,n-m)次就可以了

if(m>n-m)

m=n-m;for(int i=1;i<=m;i++){

summ*=i;

sumn=sumn*(n-i+1);

}return sumn/summ;

}void dabiao_C(){ //打表,数据为int,注意溢出数据 n<60//C(n, m) = C(n -1, m - 1) + C(n - 1, m)

for(int i=0;i)

{//C[i][0]=1; C[0][i]=0;//该写法顺序是错误的,因为这样写C[0][0]=0;

C[0][i]=0;C[i][0]=1;

}for(int i=1;i)

for(int j=1;j)

C[i][j]=C[i-1][j-1]+C[i-1][j];

}intmain(){

dabiao_C();intm,n;while(cin>>m>>n){ //mcout

}

}

2.Lucas定理求组合数

组合数C(n, m) % p

= (n!/m!/(n-m)!)%mod     组合数公式

= n!*inv(m!*(n-m)!)%mod    转化式子

= n!*(m!*((n-m)!)^(mod-2))%mod     由于p是素数,有费马小定理可知,m! * (n - m)! 关于p的逆元就是m! * (n - m)!的p-2次方。

=(n*(n-1)*..*(n-m+1) / m!) %mod.==( (n*(n-1)*..*(n-m+1))  * (m^(mod-2)) ) %mod.

你可能感兴趣的:(组合数公式用C语言怎么算)