代码改变世界

Sicily/1089. Farey Sequence

2011-07-01 19:08  Min·zc  阅读(181)  评论(0编辑  收藏  举报
 1 #include <iostream>
 2 #include <memory.h>
 3 using namespace std;
 4 long long ans[1000002];
 5 int pr[1000002];
 6 int prime[79000];
 7 void getprime()
 8 {
 9         memset(pr,0,sizeof(pr));
10         int k=0;
11         for(int i=2;i<=1000000;i++)
12                 for(int j=2;j*i<=1000000;j++)
13                 {
14                         pr[i*j]=1;
15                 }
16         prime[0]=1;
17         for(int i=2;i<=1000000;i++)
18                 if(pr[i]==0)
19                         prime[prime[0]++]=i;
20 }
21 int eular(int n)
22 {
23         int ret=1;
24         for(int i=1;i<=prime[0]&&prime[i]*prime[i]<=n;i++)
25         {
26                 if(n%prime[i]==0)
27                 {
28                         n/=prime[i];
29                         ret*=prime[i]-1;
30                         while(n%prime[i]==0)
31                         {
32                                 ret*=prime[i];
33                                 n/=prime[i];
34                         }
35                 }
36         }
37         if(n>1)
38                 ret*=n-1;
39         return ret;
40 }
41 int main()
42 {
43         getprime();
44         int n;
45         ans[1]=ans[2]=1;
46         for(int i=3;i<=1000000;i++)
47         {
48                 ans[i]=ans[i-1]+eular(i);
49         }
50         while(cin>>n&&n!=0)
51                 cout<<ans[n]<<endl;
52 }