hdu 1299 Diophantus of Alexandria

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

 

 

 

 

 

你可能感兴趣的:(ant)