poj 3478 poj 3090(欧拉函数的应用)

3478题目意思是Farey序列是由一系列不能约分的分数a/b(0<a<b<=n且gcd(a,b)=1)按照递增的顺序组成的,然后给出了Fn的前几项,让你计算Fn中有多少个分数.

很明显Fn中的数的个数就是分别与(2,3,4.....n-1,n)互质的数的个数的和。也就是求欧拉函数的前n项和。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <stack>
 5 #include <queue>
 6 #include <map>
 7 #include <algorithm>
 8 #include <vector>
 9 
10 using namespace std;
11 
12 const int maxn = 1000000;
13 
14 typedef long long LL;
15 
16 LL phi[maxn+1];
17 
18 void init()
19 {
20     LL i,j;
21     for(i=1;i<=maxn;i++) phi[i] = i;
22     for(i=2;i<=maxn;i+=2) phi[i]/=2;
23     for(i=3;i<=maxn;i+=2){
24         if(phi[i] == i){
25             for(j=i;j<=maxn;j+=i){
26                 phi[j] = phi[j]/i*(i-1);
27             }
28         }
29     }
30     for(i=3;i<maxn+1;i++){
31         phi[i]+=phi[i-1];
32     }
33 }
34 
35 int main()
36 {
37      init();
38      int n;
39      while(cin>>n&&n){
40         printf("%lld
",phi[n]);
41      }
42 
43     return 0;
44 }
View Code

 3090的情况跟3478差不多,但是要注意的可见点的情况是以x=y这条直线对称的,所以最后的答案是2*phi[n]+1,x=y也算。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <stack>
 5 #include <queue>
 6 #include <map>
 7 #include <algorithm>
 8 #include <vector>
 9 
10 using namespace std;
11 
12 const int maxn = 1000;
13 
14 typedef long long LL;
15 
16 LL phi[maxn+1];
17 
18 void init()
19 {
20     LL i,j;
21     for(i=1;i<=maxn;i++) phi[i] = i;
22     for(i=2;i<=maxn;i+=2) phi[i]/=2;
23     for(i=3;i<=maxn;i+=2){
24         if(phi[i] == i){
25             for(j=i;j<=maxn;j+=i){
26                 phi[j] = phi[j]/i*(i-1);
27             }
28         }
29     }
30     for(i=2;i<maxn+1;i++){
31         phi[i]+=phi[i-1];
32     }
33 }
34 
35 int main()
36 {
37      init();
38      int n;
39      int cas;
40      cin>>cas;
41      for(int i=1;i<=cas;i++){
42         cin>>n;
43         printf("%d %d %d
",i,n,2*phi[n]+1);
44      }
45 
46     return 0;
47 }
View Code
原文地址:https://www.cnblogs.com/lmlyzxiao/p/4956185.html