看样子就是个数学题。
其实这篇博客也是参考了部分题解的。
我们要求的是
a
n
s
=
∑
i
=
1
n
∑
j
=
1
n
i
j
g
c
d
(
i
,
j
)
ans=\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)
ans=i=1∑nj=1∑nijgcd(i,j)
这个肯定需要进行相应的变换
a
n
s
=
∑
d
=
1
n
d
∑
i
=
1
n
∑
j
=
1
n
i
j
[
g
c
d
(
i
,
j
)
=
d
]
(
枚
举
g
c
d
)
ans=\sum_{d=1}^{n}d\sum_{i=1}^{n}\sum_{j=1}^{n}ij[gcd(i,j)=d](枚举gcd)
ans=d=1∑ndi=1∑nj=1∑nij[gcd(i,j)=d](枚举gcd)
=
∑
d
=
1
n
d
3
∑
i
=
1
⌊
n
/
d
⌋
∑
j
=
1
⌊
n
/
d
⌋
i
j
[
g
c
d
(
i
,
j
)
=
1
]
(
把
d
提
取
出
来
)
=\sum_{d=1}^{n}d^3\sum_{i=1}^{\lfloor n/d \rfloor}\sum_{j=1}^{\lfloor n/d \rfloor}ij[gcd(i,j)=1] (把d提取出来)
=d=1∑nd3i=1∑⌊n/d⌋j=1∑⌊n/d⌋ij[gcd(i,j)=1](把d提取出来)
=
∑
d
=
1
n
d
3
∑
i
=
1
⌊
n
/
d
⌋
∑
j
=
1
⌊
n
/
d
⌋
i
j
∑
x
∣
g
c
d
(
i
,
j
)
μ
(
x
)
(
莫
比
乌
斯
反
演
)
=\sum_{d=1}^{n}d^3\sum_{i=1}^{\lfloor n/d \rfloor}\sum_{j=1}^{\lfloor n/d \rfloor}ij\sum_{x|gcd(i,j)} \mu(x) (莫比乌斯反演)
=d=1∑nd3i=1∑⌊n/d⌋j=1∑⌊n/d⌋ijx∣gcd(i,j)∑μ(x)(莫比乌斯反演)
=
∑
d
=
1
n
d
3
∑
x
=
1
⌊
n
/
d
⌋
μ
(
x
)
x
2
∑
i
⌊
n
/
d
x
⌋
∑
j
⌊
n
/
d
x
⌋
i
j
(
把
x
提
前
)
=\sum_{d=1}^{n}d^3\sum_{x=1}^{\lfloor n/d \rfloor} \mu(x)x^2\sum_i^{\lfloor n/dx \rfloor}\sum_j^{\lfloor n/dx \rfloor}ij(把x提前)
=d=1∑nd3x=1∑⌊n/d⌋μ(x)x2i∑⌊n/dx⌋j∑⌊n/dx⌋ij(把x提前)
=
∑
d
=
1
n
d
3
∑
x
=
1
⌊
n
/
d
⌋
μ
(
x
)
x
2
(
1
+
2
+
.
.
.
+
⌊
n
x
d
⌋
)
2
(
后
面
两
个
相
等
,
可
以
自
己
理
解
一
下
)
=\sum_{d=1}^{n}d^3\sum_{x=1}^{\lfloor n/d \rfloor} \mu(x)x^2(1+2+...+\lfloor\frac{n}{xd}\rfloor)^2(后面两个相等,可以自己理解一下)
=d=1∑nd3x=1∑⌊n/d⌋μ(x)x2(1+2+...+⌊xdn⌋)2(后面两个相等,可以自己理解一下)
我们令T=xd, Sum(x)=
∑
i
=
1
x
i
\sum_{i=1}^x i
∑i=1xi
a
n
s
=
∑
d
=
1
n
d
3
∑
x
=
1
⌊
n
/
d
⌋
μ
(
x
)
x
2
S
u
m
(
⌊
n
T
⌋
)
ans=\sum_{d=1}^{n}d^3\sum_{x=1}^{\lfloor n/d \rfloor} \mu(x)x^2Sum(\lfloor\frac{n}{T}\rfloor)
ans=d=1∑nd3x=1∑⌊n/d⌋μ(x)x2Sum(⌊Tn⌋)
=
∑
T
=
1
n
S
u
m
2
(
⌊
n
T
⌋
)
∑
d
∣
T
d
3
∗
(
T
d
)
2
∗
μ
(
T
d
)
=\sum_{T=1}^{n} Sum^2(\lfloor\frac{n}{T}\rfloor)\sum_{d|T}d^3*(\frac{T}{d})^2*\mu(\frac{T}{d})
=T=1∑nSum2(⌊Tn⌋)d∣T∑d3∗(dT)2∗μ(dT)
=
∑
T
=
1
n
S
u
m
2
(
⌊
n
T
⌋
)
∗
T
2
∑
d
∣
T
d
∗
μ
(
T
d
)
=\sum_{T=1}^{n} Sum^2(\lfloor\frac{n}{T}\rfloor)*T^2\sum_{d|T}d*\mu(\frac{T}{d})
=T=1∑nSum2(⌊Tn⌋)∗T2d∣T∑d∗μ(dT)
由于
∑
d
∣
T
d
∗
μ
(
T
/
d
)
=
ϕ
(
T
)
\sum _{d|T}d*\mu(T/d)=\phi(T)
∑d∣Td∗μ(T/d)=ϕ(T)(不懂的可以看这里),因此我们有
a
n
s
=
∑
T
=
1
n
S
u
m
2
(
⌊
n
T
⌋
)
∗
T
2
ϕ
(
T
)
ans=\sum_{T=1}^{n} Sum^2(\lfloor\frac{n}{T}\rfloor)*T^2\phi(T)
ans=T=1∑nSum2(⌊Tn⌋)∗T2ϕ(T)
由杜教筛的结论,我们可以对前面对部分采用数论分块,并可以在低于线性时间内求出
ϕ
(
T
)
\phi(T)
ϕ(T)的前缀和,这题就这么做完了。
由于本人比较菜,并不会算复杂度,数论分块的复杂度是
n
\sqrt n
n,杜教筛复杂度为
n
2
/
3
n^{2/3}
n2/3,最后复杂度应该是低于线性的吧
附上代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e6+5;
ll pri[N],vis[N],phi[N],tot,mod,inv2,inv6;
unordered_map<ll,ll>vv,mp;
ll power(ll a,ll n){
ll res=1;
for(;n;n>>=1,a=a*a%mod)
if(n&1)
res=res*a%mod;
return res;
}
void init(){
inv2=power(2,mod-2);
inv6=power(6,mod-2);
phi[1]=1;
for(int i=2;i<N;i++){
if(!vis[i]){
pri[tot++]=i;
phi[i]=i-1;
}
for(int j=0;j<tot&&pri[j]*i<N;j++){
int x=i*pri[j];
vis[x]=1;
if(i%pri[j]==0){
phi[x]=phi[i]*pri[j];
break;
}
phi[x]=phi[i]*(pri[j]-1);
}
}
for(int i=2;i<N;i++){
phi[i]=(phi[i-1]+1ll*i*i%mod*phi[i]%mod)%mod;
}
}
ll sum1(ll x){
x%=mod;
return x%mod*(x+1)%mod*inv2%mod;
}
ll sum2(ll x){
x%=mod;
return x*(x+1)%mod*(x+x+1)%mod*inv6%mod;
}
ll cal(ll x){
if(x<N)
return phi[x];
if(vv[x])
return mp[x];
ll res=0;
for(ll i=2,j;i<=x;i=j+1){
j=x/(x/i);
res=(res+cal(x/i)*(sum2(j)-sum2(i-1)+mod)%mod)%mod;
}
res=(sum1(x)*sum1(x)%mod-res+mod)%mod;
vv[x]=1,mp[x]=res;
return res;
}
int main(){
ll n,ans=0;
scanf("%lld%lld",&mod,&n);
init();
for(ll i=1,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans+sum1(n/i)*sum1(n/i)%mod*(cal(j)-cal(i-1)+mod)%mod)%mod;
}
printf("%lld\n",ans);
return 0;
}