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 }
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 }