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.