题目链接: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 }