题意
求 ∑d∈prime∑i=1n∑j=1n[(i,j)==d]\sum_{d\in prime}\sum_{i=1}^n\sum_{j=1}^n[(i,j)==d]d∈prime∑i=1∑nj=1∑n[(i,j)==d]
题解
除以 ddd ,得
∑d∈prime∑i=1⌊nd⌋∑j=1⌊nd⌋[(i,j)==1]\sum_{d\in prime}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[(i,j)==1]d∈prime∑i=1∑⌊dn⌋j=1∑⌊dn⌋[(i,j)==1]
然后运用莫比乌斯反演,得
∑d∈prime∑i=1⌊nd⌋∑j=1⌊nd⌋∑k∣(i,j)μ(k)\sum_{d\in prime}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{k|(i,j)}\mu(k)d∈prime∑i=1∑⌊dn⌋j=1∑⌊dn⌋k∣(i,j)∑μ(k)
常规套路,考虑枚举 kkk ,同时设 T=⌊nd⌋T=\lfloor\frac{n}{d}\rfloorT=⌊dn⌋ ,得
∑d∈prime∑k=1Tμ(k)⋅⌊Tk⌋2\sum_{d\in prime}\sum_{k=1}^T\mu(k)·\lfloor\frac{T}{k}\rfloor^2d∈prime∑k=1∑Tμ(k)⋅⌊kT⌋2
运用数论分块,解决。
Code
#include<cstdio>
#define ll long long
using namespace std;
int n,cnt;
int mu[10000005],sum[10000005];
int prime[100005];
bool bz[10000005];
int main(){
scanf("%d",&n);
mu[1]=1;
for (int i=2;i<=n;++i){
if (!bz[i]){
bz[i]=1;
prime[++cnt]=i;
mu[i]=-1;
}
for (int j=1;j<=cnt&&i*prime[j]<=n;++j){
bz[i*prime[j]]=1;
if (i%prime[j]) mu[i*prime[j]]=-mu[i];
else{
mu[i*prime[j]]=0;
break;
}
}
}
for (int i=1;i<=n;++i) sum[i]=sum[i-1]+mu[i];
ll ans=0;
for (int i=1;i<=cnt;++i){
ll T=n/prime[i];
for (ll l=1,r=0;l<=T;l=r+1){
r=T/(T/l);
ans+=(sum[r]-sum[l-1])*(T/l)*(T/l);
}
}
printf("%lld",ans);
return 0;
}