1一般组合数计算
mod的要求:无
有效范围:1<=n,m<=60
————————————————————————————————
//一般方法求C(n,m)最后取模。C(62,28)溢出。有效范围1<n,m<=60
ll CNormal(int n, int m)
{
if ( m>n ) return 0;
ll ans = 1;
for (int i=1; i<=m; i++)
{
ans *= (n – m + i);
ans /= i;
}
return ans % mod;
}
2杨辉三角计算组合数
mod的要求:无
有效范围:1<=n,m<=1000
————————————————————————————————
//杨辉三角求C(n,m)
ll matrix[110][110]={0};
ll CMatrix(int n, int m)
{
if ( m>n ) return 0;
ll ans = 0;
matrix[1][0] = matrix[1][1] = 1;
for (int i=2; i<=n; i++)
{
int k = min(i, m);
for(int j=0; j<=k; j++)
{
if ( j==0 || j==i ) matrix[i][j] = 1;
else matrix[i][j] = (matrix[i-1][j] + matrix[i-1][j-1]) % mod;
}
}
return matrix[n][m];
}
3利用乘法逆元求组合数
mod的要求:mod为素数,且m<mod或GCD(mod, m)=1
有效范围:1<=n,m<=10^6
————————————————————————————————