mobius-inversion-formula

Möbius inversion formula

本文中,约定 nmab 表示 ab 互质,P 为全体质数集合。

I

先来看一些函数:

φ(n)=|{x|xn,xn}|(欧拉函数)

μ(n)={0x1,x2|n1([d|n,dP])mod2=01([d|n,dP])mod2=1(莫比乌斯函数)

σ(n)=d|nd(除数函数)

上面这些函数都是数论函数,且为积性函数,即当 ab 时满足 f(ab)=f(a)f(b)
还有一些特殊的函数:

I(n)=1 (常函数)

id(n)=n (标号函数)

ε(n)=[n=1] (元函数)

这些函数在任何情况下都满足 f(ab)=f(a)f(b),被称为完全积性函数。

对于多项式函数,我们有一般的卷积;对于数论函数,我们有狄利克雷卷积

fg=d|nf(d)g(nd)

那么有:

fε=f

μI=ε

φI=id

μid=φ

显然,狄利克雷卷积拥有交换律结合律分配律

II

莫比乌斯反演公式

f(n)=d|ng(d)g(n)=d|nμ(d)f(nd)

证明:左等式告诉我们 f=gI

所以右等式的右边 μf=μgI=gε,也就等于 g

接下来证明一些做题时要用到的东西。

  • d|nμ(d)=[n=1]

证明:μI=ε

  • i=1nd|iμ(d)=d=1nndμ(d)

证明:交换求和顺序即可,dnd 个数的因子。

注:对于上面这个式子,@qzz33554432提出了是否可以通过上一个引理推出它恒等于 1。实际上,在 d 没有取值限制时上式确实等于 1,但是当 d 有取值限制时它并不等于 1,但等号仍然成立。你将在下一个引理证明过程中明白我的意思。十分感谢!

  • i=1nj=1m[ij]=d=1nndmdμ(d)

证明:

i=1nj=1m[ij]=i=1nj=1m[gcd(i,j)=1]=i=1nj=1md|gcd(i,j)μ(d)=i=1nj=1md|id|jμ(d)=i=1nd|ij=1md|jμ(d)=i=1nd|id=1mmdμ(d)=d=1nndd=1mmdμ(d)=d=1nndmdμ(d)

III

  • i=1nj=1m[gcd(i,j)=k]

i=1nj=1m[gcd(i,j)=k]=i=1nkj=1mk[gcd(i,j)=1]

就和上面一样了。

  • i=1nj=1mij[gcd(i,j)=k]

i=1nj=1mij[gcd(i,j)=k]=i=1nkj=1mkik×jk[gcd(i,j)=1]=k2i=1nkj=1mkijd|id|jμ(d)=k2d=1nki=1nkdj=1mkdid×jdμ(d)=k2d=1nkd2μ(d)i=1nkdij=1mkdj

这里后面的两个 Σ 是等差数列求和,可以 O(1) 计算,前面的可以整除分块做到 O(n)

  • i=1nj=1mlcm(i,j)

i=1nj=1mlcm(i,j)=i=1nj=1mijgcd(i,j)=k=1ni=1nj=1mijk[gcd(i,j)=k]=k=1ni=1nkj=1mkijk[gcd(i,j)=1]=k=1ni=1nkj=1mkijkd|id|jμ(d)=k=1nkd=1nkμ(d)d2i=1nkdij=1mkdj

nk 分块一次,nkd 分块一次,总复杂度 O(n)×O(n)=O(n)

接下来看一些例题吧。

IV

P1829

这题其实就是刚刚的那道 lcm。这里再讨论一种 O(n)O(n) 解法。

回到第三步:

k=1ni=1nkj=1mkijk[gcd(i,j)=1]=k=1nki=1nkj=1mkijd|id|jμ(d)=k=1nkd=1nkμ(d)d2i=1nkdij=1mkdj

s=kd,则

k=1ni=1nkj=1mkijk[gcd(i,j)=1]=k=1nkd=1nkμ(d)d2i=1nsij=1msj=s=1nsd|sμ(d)di=1nsij=1msj

现在的 d|sμ(d)d 可以 O(n) 线性筛出,剩下的东西做一次分块可以 O(n)

P2257

i=1nj=1m[gcd(i,j)P]

i=1nj=1m[gcd(i,j)P]=kk[1,n]Pi=1nkj=1mk[gcd(i,j)=1]=kk[1,n]Pd=1nnkdmkdμ(d)

s=kd,则

i=1nj=1m[gcd(i,j)P]=kk[1,n]Pd=1nnsmsμ(d)=s=1nnsmsk|skPμ(sk)

右边的 Σ 可以筛完预处理,左边的分块即可。

P3312

i=1nj=1mσ(gcd(i,j))[σ(gcd(i,j))a]

i=1nj=1mσ(gcd(i,j))=d=1nσ(d)i=1nj=1m[gcd(i,j)=d]=d=1nσ(d)i=1ndj=1md[gcd(i,j)=1]=d=1nσ(d)k=1ndnkdmkdμ(d)

s=kd,则

i=1nj=1mσ(gcd(i,j))=d=1nσ(d)k=1ndnsmsμ(k)=s=1nd|sσ(d)μ(sd)nsms=s=1nnsmsd|sσ(d)μ(sd)

这个式子已经足够漂亮了。

接下来考虑将每个询问按 a 排序,对于每次新加进满足域的 σ(d),我们枚举 sn 使得 d|s,这个 s 为答案加上 σ(d)μ(sd) 的贡献。

注意到分块的时候需要用到区间求和,所以现在需要一个支持”单点加贡献,区间查询“的东西。这个用树状数组维护即可。

复杂度 O(nlog2n+Tnlogn)

P4318

求第 k 个不含完全平方因子的数。

首先二分答案,接下来要解决的就是 1mid 中有多少个不含完全平方因子的数。

容斥一下,我们筛去 22 的倍数,筛去 32 的倍数。注意到 4 有完全平方因子,肯定之前已经被筛过了,所以可以直接跳过。

继续筛去 52 的倍数,然后发现 622232 筛了两遍,所以应该加回来一遍。

于是,我们现在需要这个一个函数:

  • 对于含完全平方因子的数,返回值为 0

  • 对于质因子个数为奇数的数,返回值为 1

  • 对于质因子个数为偶数的数,返回值为 1

显然这个函数就是 μ

最后答案为 i=1nμ(i)ni2O(n) 暴力计算即可。

P6271

给你 n=i=1wpiαi,求 i=1nid[gcd(i,n)=1]

i=1nid[gcd(i,n)=1]=i=1nidk|ik|nμ(k)=k|nμ(k)i=1nk(ik)d=k|nμ(k)kdi=1nkid

f(x)=i=1xid,我们知道这个函数一定可以表示成一个关于 xd+1 次多项式,而且我们可以在 O(d3) 或者 O(d2) 的时间内用插值,消元或者伯努利公式求出它的系数。

于是设 f(x)=i=0d+1aixi,则

i=1nid[gcd(i,n)=1]=k|nμ(k)kdf(nk)=k|nμ(k)kdi=0d+1ai(nk)i=i=0d+1ainik|nμ(k)kdi

g(n)=k|nμ(k)kdi,这个函数显然是积性函数,于是有

g(n)=j=1wg(pjαj)

观察 g(pα),发现 k 只能等于 1,p,p2,p3

而且仅当 k=1pμ 不为 0。所以

g(n)=j=1wμ(1)+μ(pj)pjdi=j=1w1pjdi

带回去可以得到原式 =i=0d+1ainij=1w1pjdi,这个式子已经可以 O(dw) 计算。

最终复杂度为 O(d3+dw)O(d2+dw)

BZOJ3309

i=1nj=1mf(gcd(i,j))=d=1nf(d)i=1nj=1m[gcd(i,j)=d]=d=1nf(d)i=1ndj=1md[gcd(i,j)=1]=d=1nf(d)k=1ndnkdmkdμ(k)

s=kd,则

i=1nj=1mf(gcd(i,j))=d=1nf(d)k=1ndnsmsμ(k)=s=1nnsmsd|sf(d)μ(sd)

左边已经可以分块,观察右边的 Σ

考虑设 s=i=1wpiki,由于式子里有个 μ(sd),因此若设 d=i=1wpiai,仅当 kiai=01 时式子才有贡献。

分类讨论:

  • 当存在 (i,j) 满足 ki<kj 时,ai 的取值显然不会影响到 f 函数的值,但会影响到 μ 函数的值,这两个值正好相反。于是就全部抵消掉了,式子值为 0

  • 当所有 ki 都相等时,设 t=max{ki},则 f(d)=t 对答案的贡献为

f(sd)=tf(d)μ(sd)=tf(d)=tμ(sd)=ti=1w(1)wi(wi)=t(11)wt(1)w=t(1)w+1

f(d)=t1 时,所有 ai 都等于 ki1,所以它对答案的贡献为 (t1)×(1)w

综合起来,所有 ki 都相等时式子值为 t(1)w+1+(t1)×(1)w=(1)w+1

接下来随便筛一下就可以 O(n+Tn) 了。

P3704

i=1nj=1mfgcd(i,j)f 是斐波那契数列。

i=1nj=1mfgcd(i,j)=d=1nfdi=1nj=1m[gcd(i,j)=d]=d=1nfdi=1ndj=1md[gcd(i,j)=1]=d=1nfdk=1ndnkdmkdμ(k)

s=kd,则

i=1nj=1mfgcd(i,j)=d=1nfdk=1ndnsmsμ(k)=s=1nd|sfdnsmsμ(sd)=s=1n(d|sfdμ(sd))nsms

这里你发现括号里的东西与 n,m 无关,并且可以 O(nlogn+nlogmod) 预处理出来,外面的部分则可以分块。最后算上快速幂,复杂度 O(nlogn+Tnlogmod)

P5518

i=1Aj=1Bk=1C(lcm(i,j)gcd(i,k))f(type),其中 type{0,1,2}f(type) 分别等于 1,ijk,gcd(i,j,k)

首先 i=1Aj=1Bk=1C(lcm(i,j)gcd(i,k))f(type)=i=1Aj=1Bk=1C(ijgcd(i,j)gcd(i,k))f(type)

我们把分子分母分开来算,现在要做的就是计算 i=1Aj=1Bk=1Cif(type)i=1Aj=1Bk=1Cgcd(i,j)f(type)

接下来分 type 考虑吧。

type=0,f(type)=1

i=1Aj=1Bk=1Ci=i=1AiBC=(A!)BC

i=1Aj=1Bk=1Cgcd(i,j)=i=1Aj=1Bgcd(i,j)C

你会发现 i=1Aj=1Bgcd(i,j) 这个式子和我们上一题研究的式子基本上是一样的,它等于

s=1A(d|sdμ(sd))AsBs

记住这个式子,它在我们下面的推导中还会用到。

这样我们在 O(nlogn) 的时间内解决了 type=0 的情况。

type=1,f(type)=ijk

Σ(n)=i=1ni=n(n+1)2

i=1Aj=1Bk=1Ciijk=(i=1Aii)Σ(B)Σ(C)

i=1Aj=1Bk=1Cgcd(i,j)ijk=(i=1Aj=1Bgcd(i,j)ij)Σ(C)=(d=1Ai=1Adj=1Bddid×jd[gcd(i,j)=1])Σ(C)=(d=1Ai=1Adj=1Bddijd2k|ik|jμ(k))Σ(C)=(d=1Ak=1Addμ(k)k2d2Σ(Akd)Σ(Bkd))Σ(C)

s=kd,则

i=1Aj=1Bk=1Cgcd(i,j)ijk=(d=1Ak=1Addμ(k)s2Σ(As)Σ(Bs))Σ(C)=(s=1A(d|sdμ(sd))s2Σ(As)Σ(Bs))Σ(C)

中间括号内的式子我们是预处理过的,这里再预处理它的 s2 次幂就好了。

分一次块,复杂度 O(nlogn)

type=2,f(type)=gcd(i,j,k)

阴间task

前置知识:欧拉反演

我们知道 n=d|nφ(d)

n 换掉,于是 gcd(i,j)=d|gcd(i,j)φ(d)=d|id|jφ(d)

那么 i=1ngcd(i,x)=i=1nd|id|xφ(d)=d|xi=1nd|iφ(d)=d|xndφ(d)

上式被称为欧拉反演

i=1Aj=1Bk=1Cigcd(i,j,k)=i=1Aij=1Bk=1Cgcd(k,gcd(i,j))

最右边可以欧拉反演,于是

i=1Aj=1Bk=1Cigcd(i,j,k)=i=1Aij=1Bd|id|jCdφ(d)=i=1Aid|ij=1Bd|jCdφ(d)=i=1Aid|iBdCdφ(d)=d=1A(i=1Adid)BdCdφ(d)=d=1A(dAdAd!)BdCdφ(d)

预处理 dφ(d) 前缀积再做一次分块即可 O(nlogn)

接下来设 G(n,x)=i=1ngcd(i,x)=d|xndφ(d)

i=1Aj=1Bk=1Cgcd(i,j)gcd(i,j,k)=i=1Aj=1Bgcd(i,j)k=1Cgcd(gcd(i,j),k)=i=1Aj=1Bgcd(i,j)G(C,gcd(i,j))=d=1AdG(C,d)i=1Adj=1Bd[gcd(i,j)=1]=d=1Adq|dCqφ(q)k=1AdAkdBkdμ(k)=q=1Ad=1Aq(dq)Cqφ(q)k=1AdqAkdqBkdqμ(k)

考虑 d,q 分开计算。

s=kd,则

q=1Ad=1AqdCqφ(q)k=1AdqAkdqBkdqμ(k)=q=1Ad=1AqdCqAsqBsqφ(q)k=1Adqμ(k)=q=1A(s=1Aq(d|sdμ(sd))AsqBsq)φ(q)Cq

你惊奇地发现最外层括号里面的东西我们在 type=0 时研究过了。

这样外层一次分块,里层一次分块就完事了。

复杂度 i=1nnilogni=O(n34logn)

还有 q,同样令 s=kd

q=1Ad=1AqqCqφ(q)k=1AdqAkdqBkdqμ(k)=q=1AqCqφ(q)s=1AqAsqBsqk|sμ(k)=q=1AqCqφ(q)s=1AqAsqBsq[s=1]=q=1AqAqBqCqφ(q)

一次分块即可,复杂度 O(nlogn)

V

感谢 cyffff 神仙对我的文章的支持。本文中的部分推导和例题来自他的文章。

感谢 An_account 大佬,他的文章是一篇很好的入门文章,引领了我踏入莫反的大门。

本文中的部分思路借鉴自题解区的文章。感谢这些文章的作者们。

本文可能随时作出修改,希望各位积极提出修改意见。

posted @   iorit  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示