题目大意: 求 ( ∑ i = 1 n ∑ j = 1 n i j gcd ( i , j ) ) m o d p (\sum_{i=1}^n \sum_{j=1}^n ij\gcd(i,j)) \bmod p (∑i=1n∑j=1nijgcd(i,j))modp
题解
一看到
gcd
\gcd
gcd 果断莫比乌斯反演,大力推柿子:
∑
i
=
1
n
∑
j
=
1
n
i
j
gcd
(
i
,
j
)
=
∑
i
=
1
n
∑
j
=
1
n
i
j
∑
k
=
1
n
k
[
gcd
(
i
,
j
)
=
k
]
=
∑
k
=
1
n
k
×
k
2
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
n
k
⌋
i
j
[
gcd
(
i
,
j
)
=
1
]
=
∑
k
=
1
n
k
3
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
n
k
⌋
i
j
∑
d
∣
gcd
(
i
,
j
)
μ
(
d
)
=
∑
k
=
1
n
k
3
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
n
k
⌋
i
j
∑
d
=
1
⌊
n
k
⌋
μ
(
d
)
[
d
∣
gcd
(
i
,
j
)
]
=
∑
k
=
1
n
k
3
∑
d
=
1
⌊
n
k
⌋
μ
(
d
)
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
n
k
⌋
i
j
[
d
∣
gcd
(
i
,
j
)
]
=
∑
k
=
1
n
k
3
∑
d
=
1
⌊
n
k
⌋
μ
(
d
)
×
d
2
∑
i
=
1
⌊
n
k
d
⌋
∑
j
=
1
⌊
n
k
d
⌋
i
j
=
∑
k
=
1
n
k
3
∑
d
=
1
⌊
n
k
⌋
μ
(
d
)
×
d
2
∑
i
=
1
⌊
n
k
d
⌋
i
×
∑
j
=
1
⌊
n
k
d
⌋
j
\sum_{i=1}^n \sum_{j=1}^n ij\gcd(i,j)\\ =\sum_{i=1}^n \sum_{j=1}^n ij \sum_{k=1}^n k[\gcd(i,j)=k]\\ =\sum_{k=1}^n k \times k^2 \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij [\gcd(i,j)=1]\\ =\sum_{k=1}^n k^3 \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij \sum_{d|\gcd(i,j)} \mu(d)\\ =\sum_{k=1}^n k^3 \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) [d|\gcd(i,j)]\\ =\sum_{k=1}^n k^3 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij [d|\gcd(i,j)]\\ =\sum_{k=1}^n k^3 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \times d^2 \sum_{i=1}^{\lfloor \frac n {kd} \rfloor} \sum_{j=1}^{\lfloor \frac n {kd} \rfloor} ij \\ =\sum_{k=1}^n k^3 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \times d^2 \sum_{i=1}^{\lfloor \frac n {kd} \rfloor} i \times \sum_{j=1}^{\lfloor \frac n {kd} \rfloor} j \\
i=1∑nj=1∑nijgcd(i,j)=i=1∑nj=1∑nijk=1∑nk[gcd(i,j)=k]=k=1∑nk×k2i=1∑⌊kn⌋j=1∑⌊kn⌋ij[gcd(i,j)=1]=k=1∑nk3i=1∑⌊kn⌋j=1∑⌊kn⌋ijd∣gcd(i,j)∑μ(d)=k=1∑nk3i=1∑⌊kn⌋j=1∑⌊kn⌋ijd=1∑⌊kn⌋μ(d)[d∣gcd(i,j)]=k=1∑nk3d=1∑⌊kn⌋μ(d)i=1∑⌊kn⌋j=1∑⌊kn⌋ij[d∣gcd(i,j)]=k=1∑nk3d=1∑⌊kn⌋μ(d)×d2i=1∑⌊kdn⌋j=1∑⌊kdn⌋ij=k=1∑nk3d=1∑⌊kn⌋μ(d)×d2i=1∑⌊kdn⌋i×j=1∑⌊kdn⌋j
设
∑
i
=
1
n
i
\sum_{i=1}^n i
∑i=1ni 为
p
(
n
)
p(n)
p(n),显然
p
(
n
)
=
(
1
+
n
)
×
n
2
p(n)=\frac {(1+n)\times n} 2
p(n)=2(1+n)×n那么有:
=
∑
k
=
1
n
k
2
∑
d
=
1
⌊
n
k
⌋
μ
(
d
)
×
d
2
×
p
(
⌊
n
k
d
⌋
)
2
=\sum_{k=1}^n k^2 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \times d^2 \times p(\lfloor \frac n {kd} \rfloor)^2
=k=1∑nk2d=1∑⌊kn⌋μ(d)×d2×p(⌊kdn⌋)2
发现
p
(
⌊
n
k
d
⌋
)
2
p(\lfloor \frac n {kd} \rfloor)^2
p(⌊kdn⌋)2 里面的这个
k
d
kd
kd 比较丑,用
i
i
i 代替掉,更换枚举对象。
=
∑
i
=
1
n
p
(
⌊
n
i
⌋
)
2
∑
k
∣
i
k
3
×
μ
(
i
k
)
×
(
i
k
)
2
=
∑
i
=
1
n
p
(
⌊
n
i
⌋
)
2
×
i
2
∑
k
∣
i
μ
(
i
k
)
×
k
=
∑
i
=
1
n
p
(
⌊
n
i
⌋
)
2
×
i
2
∑
k
∣
i
μ
(
k
)
×
i
k
=\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \sum_{k|i} k^3\times \mu(\frac i k) \times (\frac i k)^2\\ =\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \times i^2 \sum_{k|i} \mu(\frac i k)\times k\\ =\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \times i^2 \sum_{k|i} \mu(k)\times \frac i k
=i=1∑np(⌊in⌋)2k∣i∑k3×μ(ki)×(ki)2=i=1∑np(⌊in⌋)2×i2k∣i∑μ(ki)×k=i=1∑np(⌊in⌋)2×i2k∣i∑μ(k)×ki
发现后面的这个
∑
k
∣
i
μ
(
k
)
×
i
k
\sum\limits_{k|i} \mu(k)\times \frac i k
k∣i∑μ(k)×ki 就是
μ
∗
i
d
=
φ
\mu * id =\varphi
μ∗id=φ 的形式,所以有
=
∑
i
=
1
n
p
(
⌊
n
i
⌋
)
2
×
i
2
×
φ
(
i
)
=\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \times i^2 \times \varphi(i)
=i=1∑np(⌊in⌋)2×i2×φ(i)
后面的 i 2 × φ ( i ) i^2 \times \varphi(i) i2×φ(i) 是可以用杜教筛搞的,于是就做完了。
然后再推一下如何用杜教筛来搞这个东西。
设
f
(
n
)
=
n
2
×
φ
(
n
)
,
f
∗
g
=
h
f(n)=n^2\times \varphi(n),f*g=h
f(n)=n2×φ(n),f∗g=h,那么有
(
f
∗
g
)
(
n
)
=
∑
d
∣
n
f
(
d
)
×
g
(
n
d
)
(
f
∗
g
)
(
n
)
=
∑
d
∣
n
φ
(
d
)
×
i
2
×
g
(
n
d
)
(f*g)(n)=\sum_{d|n} f(d)\times g(\frac n d)\\ (f*g)(n)=\sum_{d|n} \varphi(d) \times i^2 \times g(\frac n d)
(f∗g)(n)=d∣n∑f(d)×g(dn)(f∗g)(n)=d∣n∑φ(d)×i2×g(dn)
发现这个
i
2
i^2
i2 很不和谐,于是考虑
g
(
n
)
=
i
d
(
n
)
2
g(n)=id(n)^2
g(n)=id(n)2,那么有
(
f
∗
g
)
(
n
)
=
∑
d
∣
n
φ
(
d
)
×
d
2
×
i
d
(
n
d
)
2
(
f
∗
g
)
(
n
)
=
∑
d
∣
n
φ
(
d
)
×
d
2
×
(
n
d
)
2
(
f
∗
g
)
(
n
)
=
n
2
∑
d
∣
n
φ
(
d
)
(
f
∗
g
)
(
n
)
=
n
3
(f*g)(n)=\sum_{d|n} \varphi(d) \times d^2 \times id(\frac n d)^2\\ (f*g)(n)=\sum_{d|n} \varphi(d) \times d^2 \times (\frac n d)^2\\ (f*g)(n)=n^2 \sum_{d|n} \varphi(d)\\ (f*g)(n)=n^3
(f∗g)(n)=d∣n∑φ(d)×d2×id(dn)2(f∗g)(n)=d∣n∑φ(d)×d2×(dn)2(f∗g)(n)=n2d∣n∑φ(d)(f∗g)(n)=n3
于是
f
,
g
,
h
f,g,h
f,g,h 都定下来了,而且
h
h
h 很好求,正是我们想要的,于是继续推柿子。
∑
i
=
1
n
h
(
i
)
=
∑
i
=
1
n
∑
d
∣
i
f
(
d
)
×
g
(
i
d
)
∑
i
=
1
n
h
(
i
)
=
∑
i
=
1
n
g
(
i
)
∑
j
=
1
⌊
n
i
⌋
f
(
j
)
∑
i
=
1
n
h
(
i
)
=
∑
i
=
1
n
g
(
i
)
S
(
⌊
n
i
⌋
)
∑
i
=
1
n
h
(
i
)
=
S
(
n
)
+
∑
i
=
2
n
g
(
i
)
S
(
⌊
n
i
⌋
)
S
(
n
)
=
∑
i
=
1
n
h
(
i
)
−
∑
i
=
2
n
g
(
i
)
S
(
⌊
n
i
⌋
)
\sum_{i=1}^n h(i) =\sum_{i=1}^n \sum_{d|i} f(d) \times g(\frac i d)\\ \sum_{i=1}^n h(i) =\sum_{i=1}^n g(i) \sum_{j=1}^{\lfloor \frac n i \rfloor}f(j)\\ \sum_{i=1}^n h(i) =\sum_{i=1}^n g(i) S(\lfloor \frac n i \rfloor)\\ \sum_{i=1}^n h(i) =S(n)+\sum_{i=2}^n g(i) S(\lfloor \frac n i \rfloor)\\ S(n)=\sum_{i=1}^n h(i)-\sum_{i=2}^n g(i) S(\lfloor \frac n i \rfloor)
i=1∑nh(i)=i=1∑nd∣i∑f(d)×g(di)i=1∑nh(i)=i=1∑ng(i)j=1∑⌊in⌋f(j)i=1∑nh(i)=i=1∑ng(i)S(⌊in⌋)i=1∑nh(i)=S(n)+i=2∑ng(i)S(⌊in⌋)S(n)=i=1∑nh(i)−i=2∑ng(i)S(⌊in⌋)
两个小性质:
1 3 + 2 3 + 3 3 + . . . + n 3 = ( n ( n + 1 ) 2 ) 2 1^3+2^3+3^3+...+n^3=(\frac {n(n+1)} 2)^2 13+23+33+...+n3=(2n(n+1))2
1 2 + 2 2 + 3 2 + . . . + n 2 = 1 6 n ( n + 1 ) ( 2 n + 1 ) 1^2+2^2+3^2+...+n^2=\frac 1 6 n(n+1)(2n+1) 12+22+32+...+n2=61n(n+1)(2n+1)(这个在代码里面用到,用来处理下面的 i 2 i^2 i2)
于是有
S
(
n
)
=
p
(
n
)
2
−
∑
i
=
2
n
i
2
S
(
⌊
n
i
⌋
)
S(n)=p(n)^2-\sum_{i=2}^n i^2 S(\lfloor \frac n i \rfloor)
S(n)=p(n)2−i=2∑ni2S(⌊in⌋)
注意,上面的除以 2 2 2 和除以 6 6 6 别忘了要用逆元。
以及……大数据的 n n n 是大于 p p p 的,以至于这题的取模相当讲究……
于是就做完了!代码如下:
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define maxn 6000010
#define ll long long
#define p(x) (x%mod*((x+1ll)%mod)%mod*inv2%mod)
#define w(x) ((x)%mod*inv6%mod*((x)%mod+1ll)%mod*(2ll*((x)%mod)%mod+1ll)%mod)
ll n,mod,inv2,inv6;
int prime[maxn],t=0;
ll phi[maxn];
bool v[maxn];
ll ans=0;
ll ksm(ll x,int y)
{
ll re=1,tot=x;
while(y>0)
{
if(y%2==1)re=re*tot%mod;
y/=2;
tot=tot*tot%mod;
}
return re;
}
void work()
{
phi[1]=1;//先预处理phi的前6000000位,优化杜教筛复杂度
for(int i=2;i<=maxn-10;i++)
{
if(!v[i])prime[++t]=i,phi[i]=i-1;
for(int j=1;j<=t&&i*prime[j]<=maxn-10;j++)
{
v[i*prime[j]]=true;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
for(int i=2;i<=maxn;i++)
phi[i]=phi[i]*(ll)i%mod*(ll)i%mod,phi[i]=(phi[i]+phi[i-1])%mod;
//让phi[i]乘上i^2,就得到了f(i),再求个前缀和,就变成了S(i)
inv2=ksm(2ll,mod-2);//预处理2和6的逆元
inv6=ksm(6ll,mod-2);
}
map<ll,ll>mp;
ll solve(ll x)
{
if(x<=maxn-10)return phi[x];
if(mp[x])return mp[x];
ll ans=p(x)*p(x)%mod;
ll l=2,r;
while(l<=x)
{
r=x/(x/l);
ans=(ans-solve(x/l)*(w(r)-w(l-1)+mod)%mod+mod)%mod;
//柿子都跟上面的一样,没啥好说的
l=r+1;
}
mp[x]=ans;
return ans;
}
int main()
{
scanf("%lld %lld",&mod,&n);
work();
ll l=1,r;
while(l<=n)
{
r=n/(n/l);
ans=(ans+p(n/l)*p(n/l)%mod*(solve(r)-solve(l-1)+mod)%mod)%mod;
l=r+1ll;
}
printf("%lld\n",ans);
}