题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299

1/x + 1/y = 1/n

因为x,y,n均为正整数,所以x,y均要大于n。

设y=n+k;

那么x=n^2 / k + n

因为x为正整数,所以k为n^2的因子。

因为1 ≤ n ≤ 10^9,所以不能枚举到n求n^2的因子个数。

对于一个数n如果

n=q1^a1 * q2^a2 *...qk^ak;

q1,q2...qk均为n的素因子,那么n的因子个数就可以表示为(a1+1)*(a2+1)*...*(ak+1);

n^2= n*n;

所以n^2=q1^(2*a1) * q2^(2*a2)*...*qk^(2*ak);

n^2的因子个数为(2*a1+1) * (2*a2 +1) *...*(2*ak+1);

code:

View Code
 1 # include<stdio.h>
 2 # include<string.h>
 3 # define N 32005
 4 int visit[N];
 5 void init()
 6 {
 7     int i,j;
 8     memset(visit,0,sizeof(visit));
 9     for(i=2;i<=32000;i++)
10     {
11         if(visit[i]==0)
12         {
13             for(j=i+i;j<=32000;j+=i)
14                 visit[j]=1;
15         }
16     }
17 }
18 int main()
19 {
20     int i,t,n,ncase,sum,count;
21     init();
22     scanf("%d",&ncase);
23     for(t=1;t<=ncase;t++)
24     {
25         scanf("%d",&n);
26         sum=1;
27         for(i=2;i<=32000;i++)
28         {
29             if(n==1) break;
30             if(visit[i]==0)
31             {
32                 count=0;
33                 while(n%i==0)
34                 {
35                     count++;
36                     n/=i;
37                 }
38                 sum*=(2*count+1);
39             }    
40         }
41         if(n!=1) sum*=3;
42         printf("Scenario #%d:\n%d\n\n",t,(sum+1)/2);
43     }
44     return 0;
45 }

 

 

 

 

 

posted on 2012-05-11 09:46  奋斗青春  阅读(211)  评论(0编辑  收藏  举报