莫比乌斯反演

前置:积性函数与狄利克雷卷积整除分块

两个基础积性函数:ε(n)=[n=1]1(n)=1

性质εf=ff 是任意函数。

结论f(n) 是积性函数 g(n)=d|nf(d) 是积性。

证明

方向:g=f1,狄利克雷卷积的性质在前置里面证了。

方向:归纳法。

  1. g(1)=f(1)。由于 g 积性,所以 g(1)=g(1)g(1),所以 g(1)=f(1)=1

  2. 对于 n>1,设 n=ab,(a,b)=1。归纳法知 f(1)f(n1) 是积性函数。

g(n)=g(ab)=d|abf(d)

=d1|ad2|bf(d1d2)

注意一下,当 d1=a,d2=b 时,d1d2=n,这里我们还不知道 f(n) 是积性的。所以我们要把这种情况拆出来单独考虑。

=(d1|ad2|bf(d1)f(d2))f(a)f(b)+f(ab)

另外,有条件 g 是积性函数,所以

g(n)=g(a)g(b)=d1|af(d1)d2|bf(d2)=d1|ad2|bf(d1)f(d2)

两个式子对比一下,得到 f(a)f(b)=f(ab),所以 f(n) 也是积性函数。归纳法证毕。


莫比乌斯函数:定义 d|nμ(d)=ε(n) 的函数 μ 称莫比乌斯函数。

性质1μ 是积性函数。

证明:在开头的前置里证明过这个结论。因为 ε 是积性函数,所以 μ 也是积性函数。

性质2:设 p 为质数,则:

μ(pk)={1k=01k=10k>1

证明i=0kμ(pi)=ε(pk) 代入易得。

性质3:设 nk 个质因子,则:

μ(n)={1n=10n 有质因子次数大于 1(1)k其他情况

证明:用前两个性质易得。

性质4μ1=ε


莫比乌斯反演两个公式:

  1. g(n)=d|nf(n)f=μg

  2. g(n)=n|df(n)f(n)=n|dμf,注意这个公式的 d 是一直变大直到 + 的。

只证明一:由狄利克雷卷积的结合律、交换律:

g(n)=d|nf(n)=f1

所以

μg=μ(f1)=(μ1)f=εf=f

显然这个等式从哪个方向都可以推出来。

【应用】

  1. 注意 d|nμ(d)=ε(n)。也很有用。

ZAP-Queries

i=1aj=1b[gcd(a,b)=d]a,b,d5e4。有多组测试数据,最多 5e4 组。

常用变形: gcd(a,b)=dgcd(ad,bd)=1,然后用 d|nμ(d)=ε(gcd(ad,bd)) 转化。

回到正题。

原式=i=1aj=1b[d|i]×[d|j]×[gcd(id,jd)=1]

既然 i,jd 的倍数,我们不如直接枚举 i=i/d,j=j/d

=i=1[ad]j=1[bd][gcd(i,j)=1]

莫比乌斯函数性质:d|nμ(d)=ε(n)

=i=1[ad]j=1[bd]k|gcd(i,j)μ(k)

=i=1[ad]j=1[bd]k|i,k|jμ(k)

同样,既然 i,jk 的倍数,不如先枚举 k。记 A=[ad],B=[bd]

=k=1min(A,B)i=1[Ak]j=1[Bk]μ(k)

=k=1min(A,B)[Ak][Bk]μ(k)

发现 [Ak][Bk] 的取值是 O(A) 的,可以整除分块。

为什么是 O(A) 的?把 [Ak] 的函数图像画出来,是阶梯式下降的,每一层阶梯就是一个取值区间。而 [Bk] 的函数图像最多把 [Ak] 再多分割出一倍。

整除分块后,就是对一个区间的 μ 求和,可以用前缀和。

复杂度 O(A)

公约数的和

i=1nj=i+1ngcd(i,j),n2×106

这里有一个经典 trick: 枚举 gcd 然后统计个数。

g=1ng×i=1[ng]j=i+1[ng][gcd(i,j)=1]

G=[ng]。注意这里又可以用 ε(gcd(i,j)) 了。

g=1ng×i=1Gj=i+1Gd|i,d|jμ(d)

先枚举 d

g=1ngd=1Gi=1[Gd]j=1[Gd]μ(d)

g=1ngd=1Gμ(d)i=1[Gd]j=1[Gd]1

g=1ngd=1Gμ(d)12[Gd]([Gd1])

[Gd] 进行数论分块。

复杂度:对于每一个 g,复杂度是 O(G)=O(ng) 的。

总复杂度 O(g=1nng)=O(n+n2+)<O(n+n2+)=O(nlogn).


Crash 的数字表格

经典题。求 i=1nj=1mlcm(i,j)n,m107

不妨 nm

原式=i=1nj=1mijgcd(i,j)=g=1ni=1[n/g]j=1[m/g]ijg2g[gcd(i,j)=1]

=g=1ngi=1[n/g]j=1[m/g]ijd|i,d|jμ(d)

[n/g]=N,[m/g]=M.

=g=1ngd=1Nμ(d)i=1[N/d]j=1[M/d]ij

其中 i=1[N/d]j=1[M/d]ij 是可以 O(1) 求得的。

f(x,y)=d=1xμ(d)i=1[x/d]j=1[y/d]ij

原式=ans(n)=g=1ngf([ng],[mg]).

在求 ans(n) 的时候用整除分块 [ng],[mg];在求 f() 的时候再整除分块。

复杂度 O(nN)<O(n).

.

posted @   FLY_lai  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示