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 }