目录
- 一、一些符号和等式
- 二、狄利克雷卷积
- 三、莫比乌斯反演
- 四、经典式子的推导
- 1.
i=1∑nj=1∑n[gcd(i,j)=1]
- 2.
i=1∑nj=1∑n[gcd(i,j)=k]
- 3.
i=1∑nj=1∑ngcd(i,j)
- 4.
i=1∑nj=1∑nlcm(i,j)
- 5.
i=1∑nj=1∑nijgcd(i,j)
- 五、拓展提高
一、一些符号和等式
1.a∣b意为
a整除
b
2.[a=b]={1,a=b0,a=b
3.⌊a⌋意为对
a向下取整
4.⌊k⌊n/d⌋⌋=⌊dkn⌋
二、狄利克雷卷积
关于狄利克雷卷积,请戳这里
然后莫比乌斯反演中需要知道的是
φ为欧拉函数,
μ为莫比乌斯函数,
id(n)=n,
ε(n)=[n=1],
I(n)=1
①
φ∗I=id
②
μ∗I=ε
在①等式两边同时
∗μ,我们可以得到
φ∗I∗μ=μ∗id
再根据②,我们有
φ∗ε=μ∗id
对于任意数论函数都有
f=f∗ε,故最终我们有:
③
μ∗id=φ
这里面③是非常重要的,它揭示了欧拉函数和莫比乌斯函数的关系,在有些式子的化简当中起到至关重要的作用
三、莫比乌斯反演
对于莫比乌斯反演的题目,我们只要记住上面的①式就行,写开之后就是这样
d∣n∑μ(d)=[n=1]
那么
[gcd(i,j)=1]就有
d∣gcd(i,j)∑μ(d)=[gcd(i,j)=1]
亦可以写作
d∣i,d∣j∑μ(d)=[gcd(i,j)=1]
再做一下拓展求
[gcd(i,j)=k]
因
[gcd(i,j)=k]⇔[gcd(ki,kj)=1],故有
d∣ki,d∣kj∑μ(d)=[gcd(i,j)=k]
四、经典式子的推导
1.
i=1∑nj=1∑n[gcd(i,j)=1]
推导过程
i=1∑nj=1∑n[gcd(i,j)=1]=i=1∑nj=1∑nd∣i,d∣j∑μ(d)=d=1∑nμ(d)d∣i∑d∣j∑1=d=1∑nμ(d)i=1∑⌊n/d⌋j=1∑⌊n/d⌋1=d=1∑nμ(d)⌊dn⌋2
其中的第二步,先枚举
d
再看下一步,因为
d∣i,d∣j,因此
i和
j一定是
d的整数倍
于是我们枚举
i=1,2,...,⌊n/d⌋,那么
i∗d就是原来的
i值,这样就能保证
d∣i
代码实现比较简单,求一个
μ(i)的前缀和,加一个数论分块就行
2.
i=1∑nj=1∑n[gcd(i,j)=k]
推导过程
i=1∑nj=1∑n[gcd(i,j)=k]=i=1∑nj=1∑nd∣ki,d∣kj∑μ(d)=i=1∑⌊n/k⌋j=1∑⌊n/k⌋d∣i,d∣j∑μ(d)=d=1∑nμ(d)i=1∑⌊n/dk⌋j=1∑⌊n/dk⌋1=d=1∑nμ(d)⌊dkn⌋2
其中第二步我们将
i和
j同时缩小了
k倍,于是有
i=1∑⌊n/k⌋j=1∑⌊n/k⌋d∣i,d∣j∑μ(d)
其余部分和上一条一样的
3.
i=1∑nj=1∑ngcd(i,j)
推导过程
i=1∑nj=1∑ngcd(i,j)=d=1∑ni=1∑nj=1∑nd[gcd(i,j)=d]=d=1∑ndi=1∑nj=1∑n[gcd(i,j)=d]=d=1∑ndi=1∑⌊n/d⌋j=1∑⌊n/d⌋[gcd(i,j)=1]=d=1∑di=1∑⌊n/d⌋j=1∑⌊n/d⌋t∣i,t∣j∑μ(t)=d=1∑dt=1∑⌊n/d⌋μ(t)⌊dtn⌋2
到这里,我们已经能够在
O(n)的时间内计算,但是还不够,我们仍可以继续优化下去
令
T=td,要使
⌊dtn⌋>0,于是我们枚举
T=td=1,2,...,n
i=1∑nj=1∑ngcd(i,j)=T=1∑n⌊Tn⌋2t∣T∑μ(d)(dT)
注意,
t∣T∑μ(d)(dT)=(μ∗id)(T)=φ(T)
所以最终我们有
i=1∑nj=1∑ngcd(i,j)=T=1∑n⌊Tn⌋2φ(T)
这样就能够
O(n
)计算出我们的答案
记住这里的优化方式,以后会经常碰到,当你发现优化不下去的时候,考虑代换
4.
i=1∑nj=1∑nlcm(i,j)
推导过程
首先
lcm(i,j)=gcd(i,j)ij
i=1∑nj=1∑nlcm(i,j)=i=1∑nj=1∑ngcd(i,j)ij=d=1∑ni=1∑⌊n/d⌋j=1∑⌊n/d⌋didjd[gcd(i,j)=1]=d=1∑ndi=1∑⌊n/d⌋j=1∑⌊n/d⌋ijt∣i,t∣j∑μ(t)=d=1∑ndt=1∑⌊n/d⌋μ(t)i=1∑⌊n/dt⌋itj=1∑⌊n/dt⌋jt=d=1∑ndt=1∑⌊n/d⌋μ(t)t2i=1∑⌊n/dt⌋ij=1∑⌊n/dt⌋j
我们记
sum1(n)=1+2+...+n=n(n+1)/2
其中
i=1∑⌊n/dt⌋i=1+2+...+⌊n/dt⌋=sum1(⌊n/dt⌋)
i=1∑nj=1∑nlcm(i,j)=d=1∑ndt=1∑⌊n/d⌋μ(t)t2sum1(⌊n/dt⌋)2
记
f(n)=t=1∑nμ(t)t2sum1(⌊n/t⌋)2,那么
f(n)可以
O(n
)求,于是
i=1∑nj=1∑nlcm(i,j)=d=1∑ndf(⌊n/d⌋)
最后总体就是
O(n
)O(n
)=O(n)
扫描二维码关注公众号,回复:
11414983 查看本文章
5.
i=1∑nj=1∑nijgcd(i,j)
推导过程
i=1∑nj=1∑nijgcd(i,j)=d=1∑ndi=1∑nj=1∑nij[gcd(i,j)=d]=d=1∑ndi=1∑⌊n/d⌋j=1∑⌊n/d⌋idjdt∣i,t∣j∑μ(t)=d=1∑nd3t=1∑⌊n/d⌋μ(t)i=1∑⌊n/dt⌋itj=1∑⌊n/dt⌋jt=d=1∑nd3t=1∑⌊n/d⌋μ(t)t2i=1∑⌊n/dt⌋ij=1∑⌊n/dt⌋j=d=1∑nd3t=1∑⌊n/d⌋μ(t)t2sum1(⌊n/dt⌋)2
到这里,我们已经能够
O(n)求得答案,但是别慌,我们仍然可以继续优化
又是熟悉的代换,令
T=dt,于是
i=1∑nj=1∑nijgcd(i,j)=T=1∑nsum1(⌊n/T⌋)2t∣T∑μ(t)t2(tT)3=T=1∑nsum1(⌊n/T⌋)2T2t∣T∑μ(t)(tT)
又是熟悉的
μ∗id=φ
于是最终
i=1∑nj=1∑nijgcd(i,j)=T=1∑nsum1(⌊n/T⌋)2T2φ(T)
复杂度
O(n
)
这道练习题,因为数据比较大,需要用到杜教筛
五、拓展提高
学完了上面的内容之后,相信你应该已经基本掌握了比较经典的莫比乌斯反演
写了一些题,你会发现,莫比乌斯反演难,一是难在推导,二是难在一些预处理,比如要你预先处理好一些不常见的积性函数
下面的题目就按照难度逐个击破
1.
i=1∑Nj=1∑Nlcm(ai,aj)
给你
N个数
a1,a2,...,aN,其中
1≤ai≤50000,求
i=1∑Nj=1∑Nlcm(ai,aj)
推导过程
是不是看着很熟悉呢?经典推导中第四条
先对式子做基本的变形
i=1∑Nj=1∑Nlcm(ai,aj)=i=1∑Nj=1∑Ngcd(ai,aj)aiaj
分析一下,光有
ai是没用的,我们要将式子中
ai转化为数字才行
所以我们不妨直接枚举
i,j=1,2,3,...,n=50000,这样就有
i=1∑Nj=1∑Nlcm(ai,aj)=i=1∑nj=1∑ncnticntjgcd(i,j)ij
其中
cnti,cntj为数
i,j出现次数,于是我们继续
i=1∑Nj=1∑Nlcm(ai,aj)=d=1∑ni=1∑nj=1∑ncnticntjdij[gcd(i,j)=d]=d=1∑ni=1∑⌊n/d⌋j=1∑⌊n/d⌋cntidcntjddijd2[gcd(i,j)=1]=d=1∑ndi=1∑⌊n/d⌋j=1∑⌊n/d⌋ijcntidcntjdt∣i,t∣j∑μ(t)=d=1∑ndt=1∑⌊n/d⌋μ(t)t2i=1∑⌊n/dt⌋icntidtj=1∑⌊n/dt⌋jcntjdt=d=1∑ndt=1∑⌊n/d⌋μ(t)t2⎝⎛i=1∑⌊n/dt⌋icntidt⎠⎞2
到这里我们令
T=dt
i=1∑Nj=1∑Nlcm(ai,aj)=T=1∑n⎝⎛i=1∑⌊n/T⌋icntiT⎠⎞2t∣T∑μ(t)t2(tT)=T=1∑nT⎝⎛i=1∑⌊n/T⌋icntiT⎠⎞2t∣T∑μ(t)t
先看后面的
t∣T∑μ(t)t,我们记做
f(T),我们可以
O(nlogn)预处理:
for (int t = 1; t <= n; t++)
for (int T = t; T <= n; T += t)
f[T] += mu[t] * t;
关于复杂度,这个是一个调和级数,即
1n+2n+3n+...+1,是
nlogn级别的
再看
i=1∑⌊n/T⌋icntiT,显然它也是是一个关于
T的函数
我们记
s(T)=i=1∑⌊n/T⌋icntiT=T∣t∑Ttcntt=T1T∣t∑tcntt
这样也能
O(nlogn)预处理
for (int T = 1; T <= n; T++) {
for (int t = T; t <= n; t += T)
s[T] += t * cnt[t];
s[T] /= T;
}
于是这题就能轻松搞定了
2.
i=1∑nlcm(i,n)
推导过程
i=1∑nlcm(i,n)=i=1∑ngcd(i,n)in=ni=1∑ngcd(i,n)i=nd∣n∑i=1∑n/ddid[gcd(i,dn)=1]=nd∣n∑i=1∑n/di[gcd(i,dn)=1]=nd∣n∑i=1∑di[gcd(i,d)=1]=nd∣n∑i=1∑dit∣i,t∣d∑μ(t)=nd∣n∑t∣d∑μ(t)i=1∑d/tit=nd∣n∑t∣d∑μ(t)ti=1∑d/ti=nd∣n∑t∣d∑μ(t)t2td(td+1)=2nd∣n∑⎣⎡t∣d∑μ(t)td2+t∣d∑μ(t)d⎦⎤=2nd∣n∑d⎣⎡t∣d∑μ(t)td+t∣d∑μ(t)⎦⎤=2nd∣n∑d[(μ∗id)(d)+(μ∗I)(d)]=2nd∣n∑d[φ(d)+ε(d)]
显然所有答案可以像上一题那样
O(nlogn)处理
3.
i=1∑Ngcd(⌊3i
⌋,i)
推导过程
记
n=3N
i=1∑Ngcd(⌊3i
⌋,i)=i=1∑nj=i3∑min((i+1)3−1,N)gcd(i,j)=i=1∑n−1j=i3∑(i+1)3−1gcd(i,j)+j=n3∑Ngcd(n,j)
先求前半部分
不妨记
f(n)=i=1∑nj=i3∑(i+1)3−1gcd(i,j),那么原式就是要求
f(n−1)
f(n)=i=1∑nj=i3∑(i+1)3−1gcd(i,j)=d=1∑ndi=1∑nj=i3∑(i+1)3−1[gcd(i,j)=d]=d=1∑ndi=1∑⌊n/d⌋j=⌊(id)3/d⌋∑⌊[(id+1)3−1]/d⌋[gcd(i,j)=1]=d=1∑ndi=1∑⌊n/d⌋j=⌊(id)3/d⌋∑⌊[(id+1)3−1]/d⌋t∣i,t∣j∑μ(t)=d=1∑ndt=1∑⌊n/d⌋μ(t)⎝⎜⎛i=1∑⌊n/dt⌋j=⌊(idt)3/dt⌋∑⌊[(idt+1)3−1]/dt⌋⎠⎟⎞
接下来老方法,令
T=dt
f(n)=T=1∑n⎝⎜⎛i=1∑⌊n/T⌋j=⌊(iT)3/T⌋∑⌊[(iT+1)3−1]/T⌋⎠⎟⎞t∣T∑μ(t)(tT)=T=1∑n⎝⎜⎛i=1∑⌊n/T⌋j=⌊(iT)3/T⌋∑⌊[(iT+1)3−1]/T⌋⎠⎟⎞φ(T)
再看括号里面的部分
g(n,T)=i=1∑⌊n/T⌋j=⌊(iT)3/T⌋∑⌊[(iT+1)3−1]/T⌋=i=1∑⌊n/T⌋(⌊T(iT+1)3−1⌋−⌊T(iT)3⌋+1)=i=1∑⌊n/T⌋(⌊T(iT+1)3−(iT)3−1⌋+1)=i=1∑⌊n/T⌋(3i2T+3i+1)=3Ti=1∑⌊n/T⌋i2+3i=1∑⌊n/T⌋i+⌊n/T⌋
可以预处理前缀和后
O(1)得到
那么
f(n)=T=1∑ng(n,T)φ(T),就可以
O(n)得到
最后来看原式的后半部分
j=n3∑Ngcd(n,j)
i=n3∑Ngcd(n,i)=d∣n∑di=⌊n3/d⌋∑⌊N/d⌋[gcd(dn,j)=1]=d∣n∑di=⌊n3/d⌋∑⌊N/d⌋t∣dn,t∣i∑μ(t)=d∣n∑dtd∣n∑μ(t)⎝⎛i=⌊n3/dt⌋∑⌊N/dt⌋⎠⎞⇐T=dt=T∣n∑⎝⎛i=⌊n3/T⌋∑⌊N/T⌋⎠⎞d∣T∑μ(dT)d=T∣n∑⎝⎛i=⌊n3/T⌋∑⌊N/T⌋⎠⎞φ(T)=T∣n∑(⌊N/T⌋−⌊n3/T⌋+1)φ(T)
于是我们后半部分可以
O(n
)求得
总体复杂度就是
O(n)