对这个式子先考虑枚举,
,
就变为
埃式筛法即可.
#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);
}
}
京公网安备 11010502036488号