快速组合数
double f[N+10];
f[0]=0;
for(int i=1;i<=N;i++)
f[i]=f[i-1]+log(i*1.0);
double logC(int n,int m)
{
return f[n]-f[m]-f[n-m];
}//返回log( C(n,m) )
组合数的常用公式:
c[n][m] = c[n-1][m-1] + c[n-1][m]
c[n][m] = c[n][m-1]*(n-m+1)/m
¥¥ 求C(n,m) % p (n=1e6 , p为质数)
设 C(n,m) = n! / (m! * (n-m)! ) %p = x
则 n! / (m! * (n-m)! ) = p*y + x
令 (m! * (n-m)! ) = Q
两边同乘Q^(p-1)得
n! * Q^(p-2) = (p*y+x) * Q^(p-1)
两边模p 得 (费马小定理)
n! %p * [Q^(p-2)]%p = x
即 C(n,m)% P = n! %p * [(m! * (n-m)! )^(p-2)]%p