首页 > 代码库 > uva 11417 - GCD

uva 11417 - GCD

GCD
Input: Standard Input

Output: Standard Output

 

Given the value of N, you will have to find the value of G. The definition of G is given below:

 

 

Here GCD(i,j) means the greatest common divisor of integer i and integer j.

 

For those who have trouble understanding summation notation, the meaning of G is given in the following code:

G=0;

for(i=1;i<N;i++)

for(j=i+1;j<=N;j++)

{

    G+=GCD(i,j);

}

/*Here GCD() is a function that finds the greatest common divisor of the two input numbers*/

 

Input

The input file contains at most 100 lines of inputs. Each line contains an integer N (1<N<501). The meaning of N is given in the problem statement. Input is terminated by a line containing a single zero.  This zero should not be processed.

 

Output

For each line of input produce one line of output. This line contains the value of G for corresponding N.

 

Sample Input                              Output for Sample Input

10

100

500

0

 

67

13015

442011


Problemsetter: Shahriar Manzoor

Special Thanks: Syed Monowar Hossain

 

 

 1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 const int maxn = 503; 7  8 int G[maxn]; 9 int opl[maxn];10 void init()11 {12     int i,j;13     memset(G,0,sizeof(G));14     for(i=2;i<maxn;i++) opl[i] = i;15     for(i=2;i<maxn;i++)16     {17         if(opl[i]==i)18         {19             for(j=i;j<maxn;j=j+i)20                 opl[j] = opl[j]/i*(i-1);21         }22         for(j=1;i*j<maxn;j++)/**opl [ i  ] 此时已经算出**/23             G[j*i] = G[j*i] + opl[i]*j;24     }25     for(i=3;i<maxn;i++)26         G[i] +=G[i-1];27 }28 int main()29 {30     int n;31     init();32     while(scanf("%d",&n)>0)33     {34         if(n==0)break;35         printf("%d\n",G[n]);36     }37     return 0;38 }