题目
∑ i = 1 n ∑ j = 1 n i j g c d ( i , j ) \sum_{i=1}^n\sum_{j=1}^nijgcd(i,j) i=1∑nj=1∑nijgcd(i,j)
题解
∑
i
=
1
n
∑
j
=
1
n
i
j
g
c
d
(
i
,
j
)
∑
d
=
1
n
d
3
∑
i
=
1
⌊
n
d
⌋
i
∑
j
=
1
⌊
n
d
⌋
j
[
g
c
d
(
i
,
j
)
=
=
1
]
∑
d
=
1
n
d
3
∑
i
=
1
⌊
n
d
⌋
i
∑
j
=
1
⌊
n
d
⌋
j
∑
e
∣
g
c
d
(
i
,
j
)
μ
(
e
)
\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\\\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor \frac n d\rfloor}i\sum_{j=1}^{\lfloor \frac n d\rfloor}j[gcd(i,j)==1]\\\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor \frac n d\rfloor}i\sum_{j=1}^{\lfloor \frac n d\rfloor}j\sum_{e|gcd(i,j)}\mu(e)
i=1∑nj=1∑nijgcd(i,j)d=1∑nd3i=1∑⌊dn⌋ij=1∑⌊dn⌋j[gcd(i,j)==1]d=1∑nd3i=1∑⌊dn⌋ij=1∑⌊dn⌋je∣gcd(i,j)∑μ(e)
f
(
x
)
=
∑
i
=
1
x
i
f(x)=\sum_{i=1}^xi
f(x)=∑i=1xi
∑
d
=
1
n
d
3
∑
e
=
1
⌊
n
d
⌋
μ
(
e
)
e
2
∑
i
=
1
⌊
n
d
e
⌋
i
∑
j
=
1
⌊
n
d
e
⌋
j
∑
T
=
1
n
T
2
∑
d
∣
T
d
μ
(
T
d
)
f
2
(
⌊
n
d
e
⌋
)
∑
T
=
1
n
T
2
ϕ
(
T
)
f
2
(
⌊
n
T
⌋
)
\sum_{d=1}^nd^3\sum_{e=1}^{\lfloor \frac n d\rfloor}\mu(e) e^2\sum_{i=1}^{\lfloor \frac n {de}\rfloor}i\sum_{j=1}^{\lfloor \frac n {de}\rfloor}j\\ \sum_{T=1}^nT^2\sum_{d|T}d\mu(\frac T d)f^2(\lfloor\frac{n}{de}\rfloor)\\ \sum_{T=1}^nT^2\phi(T)f^2(\lfloor\frac{n}{T}\rfloor)
d=1∑nd3e=1∑⌊dn⌋μ(e)e2i=1∑⌊den⌋ij=1∑⌊den⌋jT=1∑nT2d∣T∑dμ(dT)f2(⌊den⌋)T=1∑nT2ϕ(T)f2(⌊Tn⌋)
f
(
x
)
=
x
2
ϕ
(
x
)
g
(
x
)
=
x
2
h
(
x
)
=
(
f
∗
g
)
(
x
)
=
x
3
f(x)=x^2\phi(x)\\ g(x)=x^2\\ h(x)=(f*g)(x)=x^3
f(x)=x2ϕ(x)g(x)=x2h(x)=(f∗g)(x)=x3
整除分块套杜教筛。。。
#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define ll long long
using namespace std;
using namespace tr1;
const int N=5e6+10,M=5e6;
ll mod,inv2,inv6;
ll quick_mul(ll a,ll k)
{
ll ans=1;
while(k)
{
if(k&1)ans=ans*a%mod;
a=a*a%mod;
k>>=1;
}return ans;
}
ll inv(ll a){return quick_mul(a,mod-2);}
ll phi[N];
int z[N],p;
bool vis[N];
void Sieve()
{
phi[1]=1;
for(int i=2;i<=M;i++)
{
if(!vis[i])z[++p]=i,phi[i]=(i-1)%mod;
for(int j=1;j<=p&&i*z[j]<=M;j++)
{
vis[i*z[j]]=1;
if(i%z[j]==0){phi[i*z[j]]=phi[i]*z[j]%mod;break;}
phi[i*z[j]]=phi[i]*phi[z[j]]%mod;
}
}
for(int i=1;i<=M;i++)phi[i]=(phi[i]*i%mod*i%mod+phi[i-1])%mod;
}
ll f(ll n){n%=mod;return n*(n+1)%mod*inv2%mod;}
ll f2(ll n){n%=mod;return n*(n+1)%mod*(2ll*n%mod+1)%mod*inv6%mod;}
unordered_map<ll,ll>Phi;
ll Sum(ll n)
{
if(n<=M)return phi[n];
if(Phi[n])return Phi[n];
ll ans=f(n)*f(n)%mod;
for(ll l=2,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=((ans-(f2(r)-f2(l-1)+mod)%mod*Sum(n/l)%mod)%mod+mod)%mod;
}return Phi[n]=ans;
}
ll work(ll n)
{
ll ans=0;
for(ll l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans+f(n/l)*f(n/l)%mod*(Sum(r)-Sum(l-1)+mod)%mod)%mod;
}return ans;
}
int main()
{
ll n;
scanf("%lld%lld",&mod,&n);
Sieve();inv2=inv(2ll);inv6=inv(6ll);
printf("%lld",work(n));
}