poj 2992

http://poj.org/problem?id=2992

大意:求(n,k)的因子个数

解题思路:(n,k) = n!/(k!(n-k)!) 

任意一个数都可以用其质因子来表示  eg: 26 = 2^1 * 13^1; 240 = 2^4 * 3 *5;

即 x = p1^q1 * p2^2 *p3*q3 ....... 其因子的个数为(q1+1)*(q2+1)*(q3+1)。。。。

所以把 n! , k!, (n-k)! 中的公共因子删去,就得到的 (n,k)的结果

 

 1 #include <iostream>
 2 #include<math.h>
 3 using namespace std;
 4 long long res[437][437];
 5 int prime[437];
 6 void get_prime(){
 7    // cout<<"---------->"<<endl;
 8     int m = (int)sqrt(435+0.5);
 9     prime[0] = prime[1] =1;
10     for(int i=2;i<=m;i++){
11         if(!prime[i]){
12            // cout<<i<<endl;
13             for(int j=i*i;j<=435;j+=i)
14                 prime[j] =1;
15         }
16     }
17 
18 }
19 
20 void solve(){
21 
22     int i,j,n;
23     for(int i=2;i<=435;i++){//到i的阶乘为止,其所有质因子的个数
24         for(int j=0;j<i;j++)
25             res[i][j] = res[i-1][j];//只需再求i即可,,前面的一样。。
26         n =i;
27         for(j=2;j<=435&&n>1;j++){
28             if(!prime[j]){
29                 while(n%j==0){//注意是%j 而不是%prime[j]。。
30                     res[i][j]++;
31                     n = n/j;
32                 }
33             }
34         }
35         if(n>1)
36             res[i][n]++;
37     }
38 }
39 int main()
40 {
41     get_prime();
42     solve();
43     /*for(int i=1;i<=10;i++)
44         if(!prime[i])
45             cout<<i<<endl;*/
46     int n,k;
47     while(cin>>n>>k){
48         long long sum =1;
49         for(int i=2;i<=n;i++)
50             if(!prime[i])
51                 sum *=(res[n][i]-res[k][i]-res[n-k][i]+1);//不要忘记+1.
52         cout<<sum<<endl;
53     }
54     return 0;
55 }

 

posted @ 2013-08-02 09:52  夜晓楼  阅读(201)  评论(0编辑  收藏  举报