点击这里查看原题
经过一系列反演,得到
ans(n)=∑T=1n⌊nT⌋∗⌊nT⌋∗∑i|Tφ(i)∗μ(Ti)
(看不懂的建议先去做 BZOJ 2820)
于是接下来就是要对 ∑i|Tφ(i)∗μ(Ti) 求前缀和,这个需要分类讨论,具体看代码
/*
User:Small
Language:C++
Problem No.:4804
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=1e7+5;
int n,h[M],prime[M],cnt;
bool not_prime[M];
ll ans,sum[M];
void solve(){
ans=0;
scanf("%d",&n);
for(int i=1,r;i<=n;i=r+1){
r=n/(n/i);
ans+=(ll)(n/i)*(n/i)*(sum[r]-sum[i-1]);
}
printf("%lld\n",ans);
}
int main(){
h[1]=1;
for(int i=2;i<=1e7;i++){
if(!not_prime[i]){
prime[++cnt]=i;
h[i]=i-2;
}
for(int j=1;j<=cnt&&i*prime[j]<=1e7;j++){
not_prime[i*prime[j]]=1;
if(i%prime[j]==0){
if(i/prime[j]%prime[j]==0)
h[i*prime[j]]=h[i]*prime[j];
else h[i*prime[j]]=h[i/prime[j]]*(prime[j]-1)*(prime[j]-1);
break;
}
h[i*prime[j]]=h[i]*h[prime[j]];
}
}
for(int i=1;i<=1e7;i++) sum[i]=sum[i-1]+h[i];
int t;
scanf("%d",&t);
while(t--) solve();
return 0;
}