莫比乌斯反演专题学习笔记
本文记录一些和莫反有关的内容的笔记
可能存在诸多谬误,阅读时请谨慎分析
若发现文中有谬误,如您愿意,恳请您向我指出,不胜感激!
为什么要学莫比乌斯反演?
解决一类与狄利克雷卷积、整除、积性函数有关的问题,通过莫比乌斯反演,往往可以将复杂度优化到可接受的范围内
积性函数
对于任意互质整数(a,b)有(f(ab)=f(a)f(b))的函数称为积性函数
对于任意整数(a,b)有(f(ab)=f(a)f(b))的函数称为完全积性函数
常见,重要的积性函数有:
欧拉函数(varphi(n))
莫比乌斯函数(mu(n))
狄利克雷卷积单位元(varepsilon=[n=1])
不变函数({f{1}}(n)=1)
狄利克雷卷积
函数(f,g)的狄利克雷卷积((f*g))定义如下
狄利克雷卷积的单位元为(varepsilon=[n=1])(把它代入到狄利克雷卷积中,可以发现(f*varepsilon=f))
莫比乌斯函数
莫比乌斯函数定义如下:
下面证明莫比乌斯函数的狄利克雷卷积逆是不变函数,即
以下过程引自【算法讲堂】【电子科技大学】【ACM】莫比乌斯反演
证明:设(n)的不同质因子的个数为(k),则有
[mu*{f{1}}=sum_{d|n}mu(d)=sum_{i=0}^k(-1)^iegin{pmatrix}k\iend{pmatrix} ]由二项式定理,有
[(x+y)^k=sum_{i=0}^kx^iy^{k-i}egin{pmatrix}k\iend{pmatrix} ]令(x=-1,y=1)代入得
[0^k=sum_{i=0}^k(-1)^iegin{pmatrix}k\iend{pmatrix} ]即
[mu*{f{1}}=varepsilon ]证毕
由此,我们得到莫比乌斯函数的一个性质(sum_{d|m}mu(d)=[m=1])
由于莫比乌斯函数具有积性,我们可以用线性筛来求出莫比乌斯函数
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(n)=sum_{d|n}f(d) ightarrow f(n)=sum_{d|n}mu(d)g(frac{n}{d}) ]
证明:
证毕
-
[g(n)=sum_{n|d}f(d) ightarrow f(n)=sum_{n|d}mu(frac{d}{n})g(d) ]
证明略
整除分块
整除分块可以以(O(sqrt n))的复杂度计算(sum_{i=1}^nlfloorfrac{n}{i} floor)
首先我们发现(lfloorfrac{n}{i} floor)至多只有(sqrt{2n})个取值,并且每个取值都是一段连续的“块”
对于每一块([l,r]),(forall iin[l,r])有(lfloorfrac{n}{i} floor=lfloorfrac{n}{l} floor)
并且,(r=n/(n/l))
我们只需要逐段计算即可
有时候,我们推出的式子可能还需要乘上一个函数,如(varphi,mu)等,这时候我们只需要先对函数求前缀和,每次计算一段时乘上这一段对应的函数之和即可
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