GCD - Extreme (II)(UVA11426)

思路:欧拉函数;

欧拉函数,然后用下等差数列公式就行了。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<queue>
 5 #include<math.h>
 6 #include<vector>
 7 #include<bitset>
 8 using namespace std;
 9 typedef long long LL;
10 bool prime[5000000];
11 int ans[1000000];
12 int oula[5000000];
13 int main(void)
14 {
15     int i,j;
16     for(i = 0; i < 5000000; i++)
17     {
18         oula[i] = i;
19     }
20     for(i = 2; i <10000 ; i++)
21     {
22         if(!prime[i])
23         {
24             for(j = i; (i*j) <= 5000000; j++)
25                 prime[i*j] = true;
26         }
27     }
28     int cn = 0;
29     for(i = 2 ; i <= 5000000; i++)
30         if(!prime[i])
31             ans[cn++]=i;
32     oula[0] = 0;
33     oula[1] = 1;
34     for(i = 0; i < cn; i++)
35     {
36         for(j = 1; (ans[i]*j) <= 5000000; j++)
37         {
38             oula[ans[i]*j]/=ans[i];
39             oula[ans[i]*j]*=ans[i]-1;
40         }
41     }
42     int n;
43     while(scanf("%d",&n),n!=0)
44     {   LL sum=0;
45         for(i = 2;i <=n ;i++)
46         { LL ak = (LL)(1+n/i)*(LL)(n/i)/2;
47           sum+=ak*oula[i];
48         }
49         printf("%lld\n",sum);
50     }return 0;
51 }

 

posted @ 2016-08-22 23:47  sCjTyC  阅读(195)  评论(0编辑  收藏  举报