UVA12995 Farey Sequence [欧拉函数,欧拉筛]

  洛谷传送门

 Farey Sequence

(格式太难调,题面就不放了)


  分析:

  实际上求分数个数就是个幌子,观察可以得到,所求的就是$\sum^n_{i=2}\phi (i)$,所以直接欧拉筛+前缀和即可。

  Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<iomanip>
 7 #include<algorithm>
 8 using namespace std;
 9 const int N=1e6+7;
10 int n,phi[N],q[N];
11 long long sum[N];
12 bool vis[N];
13 void ready()
14 {
15     int top=0,k;phi[1]=1;
16     for(int i=2;i<N;i++){
17         if(!vis[i])phi[q[++top]=i]=i-1;
18         for(int j=1;j<=top&&(k=i*q[j])<N;j++){
19             vis[k]=true;
20             if(i%q[j])
21                 phi[k]=phi[i]*(q[j]-1);
22             else {
23                 phi[k]=phi[i]*q[j];break;
24             }
25         }
26     }
27     sum[2]=phi[2];
28     for(int i=3;i<N;i++)
29     sum[i]=sum[i-1]+phi[i];
30 }
31 int main()
32 {
33     ready();
34     while(555){
35         scanf("%d",&n);if(n==0)break;
36         printf("%lld\n",sum[n]);}
37     return 0;
38 }

猜你喜欢

转载自www.cnblogs.com/cytus/p/9238164.html