莫比乌斯反演专题学习笔记
本文记录一些和莫反有关的内容的笔记
可能存在诸多谬误,阅读时请谨慎分析
若发现文中有谬误,如您愿意,恳请您向我指出,不胜感激!
为什么要学莫比乌斯反演?
解决一类与狄利克雷卷积、整除、积性函数有关的问题,通过莫比乌斯反演,往往可以将复杂度优化到可接受的范围内
积性函数
对于任意互质整数a,b有f(ab)=f(a)f(b)的函数称为积性函数
对于任意整数a,b有f(ab)=f(a)f(b)的函数称为完全积性函数
常见,重要的积性函数有:
欧拉函数φ(n)
莫比乌斯函数μ(n)
狄利克雷卷积单位元ε=[n=1]
不变函数1(n)=1
狄利克雷卷积
函数f,g的狄利克雷卷积(f∗g)定义如下
(f∗g)(n)=d∣n∑f(dn)g(d)
狄利克雷卷积的单位元为ε=[n=1](把它代入到狄利克雷卷积中,可以发现f∗ε=f)
莫比乌斯函数
莫比乌斯函数定义如下:
μ(i)=⎩⎨⎧1,(−1)k,0,if i = 1if i=p1p2p3…pk(p∈prime)otherwise
下面证明莫比乌斯函数的狄利克雷卷积逆是不变函数,即
μ∗1=ε
以下过程引自【算法讲堂】【电子科技大学】【ACM】莫比乌斯反演
证明:设n的不同质因子的个数为k,则有
μ∗1=d∣n∑μ(d)=i=0∑k(−1)i(ki)
由二项式定理,有
(x+y)k=i=0∑kxiyk−i(ki)
令x=−1,y=1代入得
0k=i=0∑k(−1)i(ki)
即
μ∗1=ε
证毕
由此,我们得到莫比乌斯函数的一个性质∑d∣mμ(d)=[m=1]
由于莫比乌斯函数具有积性,我们可以用线性筛来求出莫比乌斯函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void GetPrime() { nop[1]=1,mu[1]=1; for(register int i=2;i<=N;++i) { if(!nop[i])pri[++pcnt]=i,mu[i]=-1; for(register int j=1;j<=pcnt && i*pri[j]<=N;++j) { nop[i*pri[j]]=1; if(i%pri[j]==0)break; else mu[i*pri[j]]=-mu[i]; } } }
|
莫比乌斯反演
证明:
g=f∗1,μ∗g=f∗1∗μ=f
证毕
证明略
整除分块
整除分块可以以O(n)的复杂度计算∑i=1n⌊in⌋
首先我们发现⌊in⌋至多只有2n个取值,并且每个取值都是一段连续的“块”
对于每一块[l,r],∀i∈[l,r]有⌊in⌋=⌊ln⌋
并且,r=n/(n/l)
我们只需要逐段计算即可
有时候,我们推出的式子可能还需要乘上一个函数,如φ,μ等,这时候我们只需要先对函数求前缀和,每次计算一段时乘上这一段对应的函数之和即可
1 2 3 4 5 6
| for(int l=1,r;l<=n;l=r+1) { r=n/(n/l); re+=(r-l+1)*(n/l); // re+=(sum[r]-sum[l-1])*(n/l); }
|
参考资料
【算法讲堂】【电子科技大学】【ACM】莫比乌斯反演https://www.bilibili.com/video/av43470417