題目大意:給定 N≤2∗109 N\leq2*10^9,求 ∑Ni=1φ(i) \sum_{i=1}^N\varphi(i)
同BZOJ3944
這麼喜歡炒冷飯。
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 1501000using namespace std;int limit=1500000;int n;int prime[M],tot;bool not_prime[M];long long phi[M];void Linear_Shaker(){ phi[1]=1; for(int i=2;i<=limit;i++) { if(!not_prime[i]) { prime[++tot]=i; phi[i]=i-1; } for(int j=1;i*prime[j]<=limit;j++) { not_prime[i*prime[j]]=true; if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*(prime[j]-1); } } for(int i=1;i<=limit;i++) phi[i]+=phi[i-1];}long long G(int n){ return (long long)n*(n+1)>>1;}int main(){ cin>>n; if(n<=limit) { limit=n; Linear_Shaker(); return cout<<phi[n]<<endl,0; } Linear_Shaker(); static long long F[M]; //F[n/i] int i,k; for(k=1;n/k>limit;k++); for(k--;k;k--) { F[k]=G(n/k); for(i=k<<1;n/i>limit;i+=k) F[k]-=F[i]; int m=n/k,last; for(i/=k;i<=m;i=last+1) { last=m/(m/i); F[k]-=(long long)(last-i+1)*phi[m/i]; } } cout<<F[1]<<endl; return 0;}