POJ 2992 Divisors

时间:2024-06-09 16:04:56

每个数都可以分解成素数的乘积:

写成指数形式: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 ;
}