方法一:递推,溢出问题
C(n,m)=C(n-1,m-1)+C(n-1,m)
方法二:取对数,精度问题
log(c(n,m))= log( n!/(n-m)!) -log m! = log(n-m+1)+log(n-m+2)+...+log(n)-log(1)-log(2)-...-log(m)
注意,log以2为底,用log性质,log(a)b=log a / log b
方法三:分解质因子个数,最后相乘
void Prime() //线性筛
{
int cnt=0;
for(int i=2;i<=450;++i)
{
if(!vis[i]) prime[cnt++]=i;
for(int j=0;j<cnt&&prime[j]*i<=450;++j)
{
vis[i*prime[j]] = true;
if(i%prime[j]==0) break;
}
}
int i=0;
return;
}
void solve(int t)
{
int tt=t;
for(int i=0;t!=1;i++)
{
while(t%prime[i]==0)
{
prime_num[tt][i]++; //打表各个数的分解情况
t/=prime[i];
}
}
return ;
}
for(int i=1;i<450;++i)
{
solve(i);
}
for(int i=1;i<450;++i)
{
for(int j=0;j<=100;j++)
prime_num[i][j]+=prime_num[i-1][j]; //计算i!的分解情况
}
ll ans=1;
for(int i=0;i<100;++i)
{
ans*=pow(prime[i],prime_num[n][i]-prime_num[n-m][i]-prime_num[m][i]); //n!-(n-m)!-m!
}