管理员求过,已经尽量符合书写规范了,讲解已经很清楚了。
Part 1 前置芝士
1.1 数论函数
数论函数:对于函数
f,若满足定义域为正整数,则称这个函数为
数论函数。
加性函数:对于函数
f 若满足
gcd(p,q)=1 时
f(pq)=f(p)+f(q),则称函数
f 为
加性函数。
积性函数:对于函数
f 若满足
gcd(p,q)=1 时
f(pq)=f(p)f(q),则称函数
f 为
积性函数。
若将值域扩大到任意任意正整数,仍然成立,则称为 完全加性(或积性)函数。
加性函数与积性函数均属于数论函数。
tip:
gcd(p,q)=1 指
p,q 互质。
1.2 莫比乌斯函数
根据 贝尔级数 可得:
μ(pk)=⎩⎨⎧1−10k=0k=1k>1∴μ(n)=⎩⎨⎧1(−1)k0n=1ω(n)=Ω(n)=kotherwise
tip:
ω(n)=Ω(n)=k 表示满足
n=p1p2…pk 且
pi 为
n 的互异质因子。
otherwise 指不满足上述条件。而上述条件中的
pi∣n,gcd(pi,k)=1,gcd(pi,pj)=1,指对于任意
pi,均属于质因数且与其他数
pj 互质,简称质因数两两互质,即质因数均不相同 。
1.3 莫比乌斯函数性质
性质 1
我们注意到,莫比乌斯函数有一个 重要性质:
d∣n∑μ(d)=[n=1]
tip:
d∣n 表示能被
n 整除的
d。
[n=1] 指
n=1 则值为
1,否则为
0。
(口糊一下:对于所有能被
n 整除的数,它们所有的莫比乌斯函数和,当
n 等于
1 时为
1,否则为
0)。
来自百度百科的证明:
- 当 n=1 时易证。
- 当 n=0 时,不妨令 n=p1a1p2a2p3a3...pkak。易证:在 n 的所有因子中,莫比乌斯值不为 0 的只有质因子次数为 1 的因子,而质因子次数为 a 的因子有 Ckr 个。∴d∣n∑μ(n)=Ck0−Ck1+Ck2+...+(−1)kCkk=i=0∑k(−1)iCki
性质 2 ?
就需要用到莫比乌斯反演了。
Part 2 莫比乌斯反演
2.1 芝士:欧拉函数
直接看:
φ(n)=i=1∑n[gcd(n,i)=1]
可能没看懂,口糊一下,求所有不大于
n 与
n 互质的数。
那这有什么用?
再看一个重要性质:
d∣n∑φ(n)=n
再口糊一下,所有能被
n 整除的数的欧拉函数和为
n。
来自 OI wiki 的证明:
如果
gcd(k,n)=d,那么
gcd(dk,dn)=1,(k<n)。
不妨设
f(x) 表示
gcdk,n=x 的数的个数,那么
n=i=1∑nf(i)。
根据上面证明,我们注意到,
f(x)=φ(xn),从而
n=d∣n∑φ(dn)。再次注意到,约数
d 和
dn 具有对称性,所以
n=d∣n∑φ(d)。
2.2 莫比乌斯反演及其证明
有了欧拉函数的铺垫,接下来就简单了。
还是经典直接上公式:
g(n)=d∣n∑f(d)⟺f(n)=d∣n∑g(d)μ(dn)
啊!!!完全看不懂怎么办。
g 和
f 是什么呀?
别慌,
g 和
f 只是两个数论函数,并没有定义什么。其实只是如果
g(n)=d∣n∑f(d) 或
f(n)=d∣n∑g(d)μ(dn) 中的一个条件满足,那么另一个条件也满足。
不过做题目时基本用不上。
它在做题目中最经典得运用就是这个,在下面例题中也经常用到:
p∣gcd(i,j)∑μ(p)=[gcd(i,j)=1]
接下来要正确性证明了,这里采用喜闻乐见的推柿子大法:
g(n)=d∣n∑g(d)μ(dn)=d∣n,t∣dn∑g(t)μ(dn)=t∣n∑g(t)d∣dn∑μ(d)=g(n)
2.3 性质 2
现在就知道了,
d∣n∑dμ(d)=nφ(n),证明也十分简单。
令
F(n)=n,
f(n)=φ(n),直接代入莫比乌斯反演即可。
2.4 莫比乌斯反演经典例题
题意简述
对
T 组询问求
i=1∑aj=1∑b[gcd(i,j)=d]。
数据范围:
1≤d≤a,b≤5×104,
T≤5×104。
解题思路
不妨令
a≤b。约去
d 得:
i=1∑⌊da⌋j=1∑⌊db⌋[gcd(i,j)=1]
注意到,
p∣n∑μ(n)=[n=1] 可以变为
p∣gcd(i,j)∑μ(p)=[gcd(i,j)=1],代入进去,得:
i=1∑⌊da⌋j=1∑⌊db⌋p∣gcd(i,j)∑μ(p)
枚举
p,因为
p∣gcd(i,j),所以
p 为
i,j 的因数,所以可得:
p=1∑⌊da⌋μ(p)×⌊dpa⌋×⌊dpb⌋
题意简述
对
T 组询问求
i=1∑nj=1∑m[gcd(i,j)∈prime]。
数据范围:
T=104,N,M≤107。
解题思路
我们不妨令
n≤m,
k 为质数,则
k≤n
推一下柿子:
i=1∑nj=1∑m[gcd(i,j)∈prime]=k=1∑ni=1∑nj=1∑m[gcd(i,j)=k](k∈prime)
k=1∑ni=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1](k∈prime)
注意到,
d∣n∑μ(d)=[n=1] 可以变为
d∣gcd(i,j)∑μ(d)=[gcd(i,j)=1],代入进去,得:
k=1∑ni=1∑⌊kn⌋j=1∑⌊km⌋d∣gcd(i,j)∑μ(d)(k∈prime)
枚举
d,因为
d∣gcd(i,j),所以
d 为
i,j 的因数,因此可得:
k=1∑nd=1∑⌊kn⌋μ(d)×⌊kdn⌋×⌊kdm⌋(k∈prime)
这下是不是好多了,但是,别急,不妨设
T=kd,可得:
k=1∑nd=1∑⌊kn⌋μ(d)×⌊Tn⌋×⌊Tm⌋(k∈prime)
T=1∑n⌊Tn⌋×⌊Tm⌋k∣T,k∈prime∑μ(kT)
题意简述
设
d(x) 为
x 的约数个数,给定
T 组数据
n,m,求
i=1∑nj=1∑md(ij)。
数据范围:
1≤T,n,m≤50000。
解题思路
不难发现:
d(ij)=x∣i∑y∣j∑[gcd(x,y)=1]∴i=1∑nj=1∑md(ij)=i=1∑nj=1∑mx∣i∑y∣j∑[gcd(x,y)=1]
枚举
i 和
j,不如直接枚举
x 和
y,可得:
x=1∑ny=1∑m⌊xn⌋⌊ym⌋[gcd(x,y)=1]
同样的道理:
x=1∑ny=1∑m⌊xn⌋⌊ym⌋d∣gcd(x,y)∑μ(d)
x=1∑ny=1∑m⌊xn⌋⌊ym⌋d=1∑nμ(d)×[d∣gcd(x,y)]
x=1∑⌊dn⌋y=1∑⌊dm⌋⌊dxn⌋⌊dym⌋d=1∑nμ(d)
再移项变好看一点,得:
d=1∑nμ(d)x=1∑⌊dn⌋⌊dxn⌋y=1∑⌊dm⌋⌊dym⌋
整除分块即可。
题意简述
求
i=1∑nj=1∑mlcm(i,j) 对
20101009 取模的值。
lcm(i,j) 指
i 和
j 的最小公倍数。
数据范围:
n,m≤107 (对
20101009 取模)
解题思路
i=1∑nj=1∑mlcm(i,j)=i=1∑nj=1∑mgcd(i,j)i⋅j=d=1∑ni=1∑nj=1∑mdi×j[gcd(i,j)=d]
d=1∑ni=1∑⌊dn⌋j=1∑⌊dm⌋i×j×d[gcd(i,j)=1]
还是同样的道理,同理可得:
d=1∑ni=1∑⌊dn⌋j=1∑⌊dm⌋i×j×dk∣gcd(i,j)∑μ(k)
拆开来,再移项,得:
d=1∑ndk=1∑nμ(k)i=1∑⌊dn⌋i[gcd(k,i)=1]j=1∑⌊dm⌋j[gcd(k,j)=1]
d=1∑ndk=1∑nμ(k)i=1∑⌊dkn⌋ikj=1∑⌊dkm⌋jk
太丑了,化简一下:
d=1∑ndk=1∑nk2μ(k)i=1∑⌊dkn⌋ij=1∑⌊dkm⌋j
根据等差数列求和公式:
S=2(a1+an)×n。再进行进一步拆开,得:
=d=1∑ndk=1∑nk2μ(k)×2⌊dkn⌋(⌊dkn⌋+1)×2⌊dkm⌋(⌊dkm⌋+1)d=1∑ndk=1∑nk2μ(k)×4⌊dkn⌋⌊dkm⌋(⌊dkn⌋+1)(⌊dkm⌋+1)
其实这样已经可以在洛谷
卡过了。但是,显然这
O(n2) 解法还是不够优秀。
来,设
x=dk,所以可得:
x=1∑nxk∣x∑kμ(k)×4⌊xn⌋⌊xm⌋(⌊xn⌋+1)(⌊xm⌋+1)
令
g(x)=d∣x∑xd×μ(d),注意到,函数
g 是一个积性函数。
∴g(∏Piai)=∏g(Piai)=∏(x×Pi0×μ(1)+x×Pi×μ(Pi))=∏((1−Pi)x)
∴g(p)=1−pg(pk)=g(pk−1)
这样在满足
gcd(n,p)=1 的情况可得:
g(np)=g(n)×g(p)
所以我们只要预处理筛
g(T)=d∣T∑d⋅μ(dT) 就行了。
Part 3 总结
这篇是本蒟蒻第一篇算法专栏,结合了 OI Wiki,百度百科与许多题解。其中特意没有写
狄利克雷卷积,意在更容易理解,有兴趣可以阅读。若有错误,欢迎指出。
莫比乌斯反演其实很简单,大部分只需用
p∣gcd(i,j)∑μ(p)=[gcd(i,j)=1] 这一公式,难在推柿子。它是数论中的重要部分,希望大家能熟练掌握。