Farey Sequence
(格式太难调,题面就不放了)
分析:
实际上求分数个数就是个幌子,观察可以得到,所求的就是$sum^n_{i=2}phi (i)$,所以直接欧拉筛+前缀和即可。
Code:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<iomanip> #include<algorithm> using namespace std; const int N=1e6+7; int n,phi[N],q[N]; long long sum[N]; bool vis[N]; void ready() { int top=0,k;phi[1]=1; for(int i=2;i<N;i++){ if(!vis[i])phi[q[++top]=i]=i-1; for(int j=1;j<=top&&(k=i*q[j])<N;j++){ vis[k]=true; if(i%q[j]) phi[k]=phi[i]*(q[j]-1); else { phi[k]=phi[i]*q[j];break; } } } sum[2]=phi[2]; for(int i=3;i<N;i++) sum[i]=sum[i-1]+phi[i]; } int main() { ready(); while(555){ scanf("%d",&n);if(n==0)break; printf("%lld ",sum[n]);} return 0; }