POJ 2992 Divisors

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

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

所以接下来的事就容易办了.....

我的代码:

 1 #include<cstdio>
 2 using namespace std;
 3 int e[432][432],sum[432][432],n,num,kk;
 4 bool prim[432];
 5 long long ans;
 6 int main()
 7 {
 8     for(int i=2; i<432; i++)
 9     {
10         if(!prim[i])
11         {
12             num++;
13             e[i][num]++;
14             for(int j=i<<1; j<432; j+=i)
15             {
16                 prim[j]=1;
17                 e[j][num]=e[j/i][num]+1;
18             }
19         }
20     }
21     for(int i=1; i<432; i++)
22         for(int k=1; k<=num; k++)
23             sum[i][k]=sum[i-1][k]+e[i][k];
24     while(scanf("%d%d",&n,&kk)!=EOF)
25     {
26         ans=1;
27         for(int i=1; i<=num; i++)
28             ans=ans*(sum[n][i]-sum[kk][i]-sum[n-kk][i]+1);
29 
30         printf("%lld\n",ans);
31     }
32     return 0;
33 }
View Code

 

posted @ 2013-08-25 19:34  Yours1103  阅读(145)  评论(0编辑  收藏  举报