题解:枚举gcd,算每个gcd对答案的贡献,贡献用到欧拉函数的一个结论
最后用nlogn预处理一下,O(1)出答案
把long long 打成int 竟然没看出来QWQ
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int maxn=1000009; const int u=1000000; typedef long long Lint; int T; int n; int cntprime; int prime[maxn]; int vis[maxn]; Lint phi[maxn]; Lint f[maxn]; void Lineshake(){ vis[1]=1;phi[1]=1; for(int i=2;i<=u;++i){ if(!vis[i]){ prime[++cntprime]=i; phi[i]=i-1; } for(int j=1;(j<=cntprime)&&(i*prime[j]<=u);++j){ vis[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*(prime[j]-1); } } phi[1]=1; for(int i=2;i<=u;++i)phi[i]=phi[i]*1LL*i/2; } void minit(){ cntprime=0; memset(vis,0,sizeof(vis)); } int main(){ scanf("%d",&T); minit(); Lineshake(); for(int d=1;d<=u;++d){ for(int k=1;k*d<=u;++k){ f[d*k]+=phi[d]*d*k; } } while(T--){ scanf("%d",&n); printf("%lld\n",f[n]); } return 0; }