题意
给定n和p(p为质数)求
∑
i
=
1
n
∑
j
=
1
n
i
j
g
c
d
(
i
,
j
)
%
p
\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\% p
i=1∑nj=1∑nijgcd(i,j)%p
n
≤
1
0
10
,
5
×
1
0
8
≤
p
≤
1.1
×
1
0
9
n\le 10^{10},5\times 10^8\le p\le1.1 \times 10^9
n≤1010,5×108≤p≤1.1×109
思路
经典的先提出gcd
=
∑
d
=
1
n
d
∑
i
=
1
n
∑
j
=
1
n
i
j
[
g
c
d
(
i
,
j
)
=
=
d
]
=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d]
=d=1∑ndi=1∑nj=1∑nij[gcd(i,j)==d]
后面的部分除以d,有
=
∑
d
=
1
n
d
∑
i
=
1
n
d
∑
j
=
1
n
d
d
i
d
j
[
g
c
d
(
i
,
j
)
=
=
1
]
=\sum_{d=1}^nd\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}di\ dj[gcd(i,j)==1]
=d=1∑ndi=1∑dnj=1∑dndi dj[gcd(i,j)==1]
提出后面的d
=
∑
d
=
1
n
d
3
∑
i
=
1
n
d
∑
j
=
1
n
d
i
j
[
g
c
d
(
i
,
j
)
=
=
1
]
=\sum_{d=1}^nd^3\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}ij[gcd(i,j)==1]
=d=1∑nd3i=1∑dnj=1∑dnij[gcd(i,j)==1]
然后进行莫比乌斯反演,将
∑
d
∣
n
μ
(
d
)
=
[
n
=
=
1
]
\sum_{d|n}\mu(d)=[n==1]
∑d∣nμ(d)=[n==1]带入有
=
∑
d
=
1
n
d
3
∑
i
=
1
n
d
∑
j
=
1
n
d
i
j
∑
k
∣
g
c
d
(
i
,
j
)
μ
(
k
)
=\sum_{d=1}^nd^3\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}ij\sum_{k|gcd(i,j)}\mu(k)
=d=1∑nd3i=1∑dnj=1∑dnijk∣gcd(i,j)∑μ(k)
将k提出有,及枚举1到
n
d
\frac{n}{d}
dn内k的倍数
=
∑
d
=
1
n
d
3
∑
k
=
1
n
d
μ
(
k
)
∑
i
=
1
n
d
k
∑
j
=
1
n
d
k
k
i
k
j
=\sum_{d=1}^nd^3\sum_{k=1}^{\frac{n}{d}}\mu(k)\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ki\ kj
=d=1∑nd3k=1∑dnμ(k)i=1∑dknj=1∑dknki kj
=
∑
d
=
1
n
d
3
∑
k
=
1
n
d
μ
(
k
)
k
2
∑
i
=
1
n
d
k
∑
j
=
1
n
d
k
i
j
=\sum_{d=1}^nd^3\sum_{k=1}^{\frac{n}{d}}\mu(k)k^2\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ij
=d=1∑nd3k=1∑dnμ(k)k2i=1∑dknj=1∑dknij
上式等价于
=
∑
d
=
1
n
d
3
∑
d
k
=
1
n
μ
(
k
)
k
2
∑
i
=
1
n
d
k
∑
j
=
1
n
d
k
i
j
=\sum_{d=1}^nd^3\sum_{dk=1}^{n}\mu(k)k^2\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ij
=d=1∑nd3dk=1∑nμ(k)k2i=1∑dknj=1∑dknij
令
T
=
d
k
T=dk
T=dk有
=
∑
d
=
1
n
d
3
∑
T
=
1
n
[
T
%
d
=
=
0
]
μ
(
T
d
)
(
T
d
)
2
∑
i
=
1
n
T
∑
j
=
1
n
T
i
j
=\sum_{d=1}^nd^3\sum_{T=1}^{n}[T\% d==0]\mu(\frac{T}{d})(\frac{T}{d})^2\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij
=d=1∑nd3T=1∑n[T%d==0]μ(dT)(dT)2i=1∑Tnj=1∑Tnij
我们将
d
3
d^3
d3乘入
=
∑
d
=
1
n
∑
T
=
1
n
[
T
%
d
=
=
0
]
μ
(
T
d
)
d
T
2
∑
i
=
1
n
T
∑
j
=
1
n
T
i
j
=\sum_{d=1}^n\sum_{T=1}^{n}[T\% d==0]\mu(\frac{T}{d})dT^2\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij
=d=1∑nT=1∑n[T%d==0]μ(dT)dT2i=1∑Tnj=1∑Tnij
这里可以看作枚举的是1到n中每一个d的倍数,那么我们也等价于枚举1到n中每个数T的因子
=
∑
T
=
1
n
T
2
∑
d
∣
T
d
μ
(
T
d
)
∑
i
=
1
n
T
∑
j
=
1
n
T
i
j
=\sum_{T=1}^nT^2\sum_{d|T}d\mu(\frac{T}{d})\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij
=T=1∑nT2d∣T∑dμ(dT)i=1∑Tnj=1∑Tnij
对于式子
∑
i
=
1
n
T
∑
j
=
1
n
T
i
j
\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij
i=1∑Tnj=1∑Tnij
有
∑
i
=
1
n
T
i
∑
j
=
1
n
T
j
=
∑
i
=
1
n
T
i
(
(
⌊
n
T
⌋
+
1
)
⌊
n
T
⌋
2
)
=
(
(
⌊
n
T
⌋
+
1
)
⌊
n
T
⌋
2
)
2
\sum_{i=1}^{\frac{n}{T}}i\sum_{j=1}^{\frac{n}{T}}j=\sum_{i=1}^{\frac{n}{T}}i(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})=(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})^2
i=1∑Tnij=1∑Tnj=i=1∑Tni(2(⌊Tn⌋+1)⌊Tn⌋)=(2(⌊Tn⌋+1)⌊Tn⌋)2
对于式子
∑
d
∣
T
d
μ
(
T
d
)
\sum_{d|T}d\mu(\frac{T}{d})
∑d∣Tdμ(dT)可以发现是
i
d
id
id于
μ
\mu
μ的狄利克雷卷积
i
d
∗
μ
=
φ
id*\mu=\varphi
id∗μ=φ
所以有
=
∑
T
=
1
n
T
2
φ
(
T
)
(
(
⌊
n
T
⌋
+
1
)
⌊
n
T
⌋
2
)
2
=\sum_{T=1}^nT^2\varphi(T)(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})^2
=T=1∑nT2φ(T)(2(⌊Tn⌋+1)⌊Tn⌋)2
然后可以对
∑
T
=
1
n
T
2
φ
(
T
)
\sum_{T=1}^nT^2\varphi(T)
T=1∑nT2φ(T)用杜教筛
令
f
(
x
)
=
x
2
φ
(
x
)
f(x)=x^2\varphi(x)
f(x)=x2φ(x),
g
(
x
)
=
x
2
g(x)=x^2
g(x)=x2,
S
(
n
)
=
∑
i
=
1
n
f
(
i
)
S(n)=\sum_{i=1}^nf(i)
S(n)=∑i=1nf(i)
∑
i
=
1
n
g
∗
f
=
∑
i
=
1
n
∑
d
∣
i
g
(
d
)
f
(
i
d
)
=
∑
i
=
1
n
∑
d
∣
i
d
2
(
i
d
)
2
φ
(
i
d
)
\sum_{i=1}^ng*f=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{i=1}^n\sum_{d|i}d^2(\frac{i}{d})^2\varphi(\frac{i}{d})
i=1∑ng∗f=i=1∑nd∣i∑g(d)f(di)=i=1∑nd∣i∑d2(di)2φ(di)
=
∑
i
=
1
n
i
2
∑
d
∣
i
φ
(
i
d
)
=\sum_{i=1}^ni^2\sum_{d|i}\varphi(\frac{i}{d})
=i=1∑ni2d∣i∑φ(di)
有
∑
d
∣
n
φ
(
d
)
=
n
\sum_{d|n}\varphi(d)=n
∑d∣nφ(d)=n,故
=
∑
i
=
1
n
i
3
=\sum_{i=1}^ni^3
=i=1∑ni3
再看
∑
i
=
1
n
∑
d
∣
i
g
(
d
)
f
(
i
d
)
\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})
∑i=1n∑d∣ig(d)f(di)
考虑枚举每个因子的倍数
∑
i
=
1
n
∑
d
∣
i
g
(
d
)
f
(
i
d
)
=
∑
d
=
1
n
g
(
d
)
∑
i
=
1
⌊
n
d
⌋
f
(
i
)
=
∑
d
=
1
n
g
(
d
)
S
(
⌊
n
d
⌋
)
\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{d=1}^ng(d)\sum_{i=1}^{\left \lfloor\frac{n}{d}\right \rfloor}f(i)=\sum_{d=1}^ng(d)S(\left \lfloor\frac{n}{d}\right \rfloor)
i=1∑nd∣i∑g(d)f(di)=d=1∑ng(d)i=1∑⌊dn⌋f(i)=d=1∑ng(d)S(⌊dn⌋)
g
(
1
)
S
(
n
)
+
∑
d
=
2
n
g
(
d
)
S
(
⌊
n
d
⌋
)
=
∑
i
=
1
n
i
3
g(1)S(n)+\sum_{d=2}^ng(d)S(\left \lfloor\frac{n}{d}\right \rfloor)=\sum_{i=1}^ni^3
g(1)S(n)+d=2∑ng(d)S(⌊dn⌋)=i=1∑ni3
g
(
x
)
=
x
2
g(x)=x^2
g(x)=x2带入移项得
S
(
n
)
=
∑
i
=
1
n
i
3
−
∑
d
=
2
n
d
2
S
(
⌊
n
d
⌋
)
S(n)=\sum_{i=1}^ni^3-\sum_{d=2}^nd^2S(\left \lfloor\frac{n}{d}\right \rfloor)
S(n)=i=1∑ni3−d=2∑nd2S(⌊dn⌋)
有
∑
i
=
1
n
i
3
=
(
n
(
n
+
1
)
2
)
2
,
∑
i
=
1
n
i
2
=
n
(
n
+
1
)
(
2
n
+
1
)
6
\sum_{i=1}^ni^3=(\frac{n(n+1)}{2})^2,\sum_{i=1}^ni^2=\frac{n(n+1)(2n+1)}{6}
i=1∑ni3=(2n(n+1))2,i=1∑ni2=6n(n+1)(2n+1)
用杜教筛就可以做了
注意n大于int,预处理时可能会爆,注意取模
#include <bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int prime[N];
long long phi[N];
int vis[N];
int cnt;
long long mod;
long long inv2;
long long inv4;
long long inv6;
long long quickmod(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b%2==1)
ans=ans*a%mod;
b=b/2;
a=a*a%mod;
}
return ans;
}
void init()
{
cnt=0;
phi[1]=1;
for(int i=2;i<N;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;j<cnt&&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++)
phi[i]=(phi[i-1]+1ll*i*i%mod*phi[i]%mod)%mod;
}
map<long long,long long>P;
long long Sum2(long long n)
{
return n%mod*((n+1)%mod)%mod*(2*n%mod+1)%mod*inv6%mod;
}
long long Sum(long long n)
{
if(n<N) return phi[n];
if(P[n]) return P[n];
long long sum=n%mod*((n+1)%mod)%mod*(n%mod)%mod*((n+1)%mod)%mod*inv4%mod;
for(long long i=2,last;i<=n;i=last+1)
{
last=n/(n/i);
sum=(sum-(Sum2(last)-Sum2(i-1)+mod)%mod*Sum(n/i)%mod+mod)%mod;
}
return P[n]=sum;
}
int main()
{
long long n;
scanf("%lld%lld",&mod,&n);
init();
inv2=quickmod(2,mod-2);
inv4=quickmod(4,mod-2);
inv6=quickmod(6,mod-2);
long long sum=0;
for(long long i=1,last;i<=n;i=last+1)
{
last=n/(n/i);
sum=(sum+(Sum(last)-Sum(i-1)+mod)%mod*((n/i+1)%mod)%mod*((n/i)%mod)%mod*((n/i+1)%mod)%mod*((n/i)%mod)%mod*inv4%mod)%mod;
}
printf("%lld\n",sum);
return 0;
}