51Nod-1188 最大公约数之和V2(欧拉函数)
对这个式子先考虑枚举,
,
就变为
埃式筛法即可.
#include<bits/stdc++.h> using namespace std; #define me(a,x) memset(a,x,sizeof(a)) #define IN freopen("in.txt","r",stdin); #define STR clock_t startTime = clock(); #define END clock_t endTime = clock();cout << double(endTime - startTime) / CLOCKS_PER_SEC *1000<< "ms" << endl; const int N=5e6+6; const int mod=1e9+7; const int inv2=mod+1>>1; typedef long long ll; int prime[N],tot=0; bool vis[N]={0}; ll f[N],phi[N]; void pre(){ phi[1]=1;f[0]=phi[0]=0; for(int i=2;i<N;i++){ if(!vis[i])prime[++tot]=i,phi[i]=i-1; for(int j=1;j<=tot&&i*prime[j]<N;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; }else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } for(int i=1;i<N;i++) for(int j=i;j<N;j+=i) f[j]+=1LL*i*phi[j/i]; for(int i=1;i<N;i++)f[i]+=f[i-1]; } int main(){ pre(); int t;cin>>t; while(t--){ int n; scanf("%d",&n); printf("%lld\n",f[n]-1ll*n*(n+1)/2); } }