每个数都可以分解成素数的乘积:
写成指数形式:n=p1^e1*p2^e2*...*pn^en;(p都是素数)
那么n的因数的数量m=(e1+1)*(e2+1)*...*(en+1);
所以用筛选法筛出1-n的各个素因数的数量;
然后容易得到n!的各个素因数的数量;
因为C(n,k)=n!/k!/(n-k)!;
所以接下来的事就容易办了.....
我的代码:
#include<cstdio>
using namespace std;
int e[][],sum[][],n,num,kk;
bool prim[];
long long ans;
int main()
{
for(int i=; i<; i++)
{
if(!prim[i])
{
num++;
e[i][num]++;
for(int j=i<<; j<; j+=i)
{
prim[j]=;
e[j][num]=e[j/i][num]+;
}
}
}
for(int i=; i<; i++)
for(int k=; k<=num; k++)
sum[i][k]=sum[i-][k]+e[i][k];
while(scanf("%d%d",&n,&kk)!=EOF)
{
ans=;
for(int i=; i<=num; i++)
ans=ans*(sum[n][i]-sum[kk][i]-sum[n-kk][i]+); printf("%lld\n",ans);
}
return ;
}