题目:
https://www.luogu.com.cn/problem/SP5971
求 ∑ i = 1 n l c m ( i , n ) n ≤ 1 0 6 \sum_{i=1}^{n}lcm(i,n)\quad n\le 10^6 ∑i=1nlcm(i,n)n≤106
思路:
∑
i
=
1
n
l
c
m
(
i
,
n
)
=
∑
i
=
1
n
i
∗
n
(
i
,
n
)
=
∑
d
=
1
n
∑
i
=
1
n
i
∗
n
d
[
(
i
,
n
)
=
d
]
另
i
=
k
∗
d
=
∑
d
∣
n
∑
k
=
1
n
d
k
∗
n
[
(
k
,
n
d
)
=
1
]
有
∑
i
=
1
n
i
[
(
i
,
n
)
=
1
]
=
φ
(
n
)
∗
n
2
=
n
∑
d
∣
n
φ
(
n
d
)
∗
n
d
2
=
n
∑
d
∣
n
φ
(
d
)
∗
d
2
\begin{aligned} &\sum_{i=1}^{n}lcm(i,n)\\ =&\sum_{i=1}^{n}\frac{i*n}{(i,n)}\\ =&\sum_{d=1}^{n}\sum_{i=1}^{n}\frac{i*n}{d}[(i,n)=d]\quad另i=k*d\\ =&\sum_{d|n}\sum_{k=1}^{\frac{n}{d}}k*n[(k,\frac{n}{d})=1]\quad有\sum_{i=1}^{n}i[(i,n)=1]=\frac{\varphi(n)*n}{2}\\ =&n\sum_{d|n}\frac{\varphi(\frac{n}{d})*\frac{n}{d}}{2}\\ =&n\sum_{d|n}\frac{\varphi(d)*d}{2} \end{aligned}
=====i=1∑nlcm(i,n)i=1∑n(i,n)i∗nd=1∑ni=1∑ndi∗n[(i,n)=d]另i=k∗dd∣n∑k=1∑dnk∗n[(k,dn)=1]有i=1∑ni[(i,n)=1]=2φ(n)∗nnd∣n∑2φ(dn)∗dnnd∣n∑2φ(d)∗d
线性筛
#include <cstdio>
const int N=1000000;
int tot,p[N+5],phi[N+5];
long long ans[N+5];
bool flg[N+5];
void solve() {
phi[1]=1;
for(int i=2;i<=N;++i) {
if(!flg[i]) p[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot&&i*p[j]<=N;++j) {
flg[i*p[j]]=1;
if(i%p[j]==0) {
phi[i*p[j]]=phi[i]*p[j];
break;
}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
for(int i=1;i<=N;++i) {
for(int j=1;i*j<=N;++j) {
ans[i*j]+=1LL*j*phi[j]/2;
}
}
for(int i=1;i<=N;++i) ans[i]=1LL*i*ans[i]+i;
}
int main() {
int T,n;
solve();
for(scanf("%d",&T);T;--T) {
scanf("%d",&n);
printf("%lld\n",ans[n]);
}
return 0;
}