莫比乌斯反演学习笔记

前置知识

狄利克雷卷积:fg=d|nf(d)g(nd)

积性函数,线性筛。

数论分块。

单位函数:ε(n)=[n=1]。(积性函数)

常数函数:1(n)=1。(积性函数)

莫比乌斯函数

引理1: f(n) 是积性函数等价于 g(n)=d|nf(d) 是积性函数。

证明:

显然,g=f1,所以 f(n) 是积性函数可以推出 g(n) 是积性函数。

g(n) 是积性函数,归纳法。

首先,g(1)=f(1),因为 g(1)=g(1)g(1),所以 f(1)=g(1)=1

假设对于所有小于 n 的值,f(n) 都是积性函数。

不妨设 n=ab,gcd(a,b)=1,则有:

g(n)=g(ab)=d|abf(d)=d1|ad2|bf(d1d2)=d1|ad2|bf(d1)f(d2)f(a)f(b)+f(ab)

又因为:

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

两式联立,得 f(a)f(b)+f(ab)=0,即 f(n)=f(ab)=f(a)f(b),得证。

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

性质1: 莫比乌斯函数是积性函数。

证明:

由于 ε(n) 是积性函数,根据引理1可知,μ(n) 也是积性函数。

性质2: p 为质数,则:

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

说明:

代入定义的式子得到 i=0kμ(pi)=ε(pk),推一下就可以得到。

性质3:n 质因数分解后有 k 个不同的质因数,则:

μ(n)={1n=10n有平方因子(1)kOtherwise.

说明:

根据 μ(pk) 以及它是积性函数可得。

莫比乌斯反演

反演公式1:

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

反演公式2:

g(n)=n|df(d)f(n)=n|dμ(dn)g(d)

证明:

这里只证明公式 1。

考虑狄利克雷卷积。

首先,狄利克雷卷积满足交换律,结合律。

g=f1,所以:

f(n)=d|nμ(nd)g(d)=μg=μ(f1)=(μ1)f=εf=f

得证。

证明2:

d|nμ(nd)g(d)=d|nμ(nd)d|df(d)=d|nf(d)d=dj|nμ(nd)=d|nf(d)j|ndμ(ndj)=d|nf(d)j|ndμ(j)=d|nf(d)ε(nd)=f(n)

得证。

应用

题目1:i=xnj=ym[gcd(i,j)=k]。(P2522 [HAOI2011] Problem bP3455 [POI2007] ZAP-Queries

思路:

只要求出 x=1,y=1 的情况就可以求出答案。

i=1nj=1m[gcd(i,j)=k]=i=1nkj=1mk[gcd(i,j)=1]=i=1nkj=1mkε(gcd(i,j))=i=1nkj=1mkd|i,d|jμ(d)=d1μ(d)i=1nkj=1mk[d|gcd(i,j)]=d1μ(d)nkdmkd

预处理 μ 的前缀和,数论分块即可。

关键在于将 [n=1] 转化为 d|nμ(d) 与交换求和顺序。

但是这其实只是利用了 d|nμ(d)=[n=1] 这个结论,并没有真正的用反演公式。

其实用反演公式会非常显然。

f(k) 表示 i=1nj=1m[gcd(i,j)=k]f(d) 即是答案。

g(k) 表示 i=1nj=1m[k|gcd(i,j)],显然有:

g(k)=k|xf(x)

我们也可以直接计算出 g(k)=nkmk

所以反演得到:

f(k)=k|xμ(x)g(xk)

也就是枚举所有 k 的倍数,和之前的式子其实是一样的。

相对而言,我们去找 fg 会比直接推式子简单一些。

题目2:i=1nj=1mlcm(i,j)1n,m107。(P1829 [国家集训队] Crash的数字表格 / JZPTAB

思路:

推式子。

i=1nj=1mlcm(i,j)=i=1nj=1mijgcd(i,j)=k1i=1nj=1m[gcd(i,j)=k]ijk=k1i=1nkj=1mk[gcd(i,j)=1]ijk=k1ki=1nkj=1mk[gcd(i,j)=1]ij

f(N,M)=i=1Nj=1M[gcd(i,j)=1]ij,则:

f(N,M)=i=1Nj=1M[gcd(i,j)=1]ij=i=1Nj=1Mijd|i,d|jμ(d)=d1μ(d)i=1Ndj=1Mdijd2=d1μ(d)d2i=1Ndj=1Mdij

g(N,M)=i=1Nj=1Mij,显然 g(N,M)=NM(N+1)(M+1)4

所以上式等于:

d1μ(d)d2g(Nd,Md)

h(n)=μ(n)n2,显然是个积性函数,我们可以预处理它的前缀和,然后配合数论分块在 O(N) 的时间内算出 f(N,M),最后的答案即为:

k1kf(nkmk)

再次数论分块,调用 f(N,M) n 次,所以最终的复杂度是 O(n) 的。

同理,我们也可以用反演公式来推。

记:

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

g(k)=k|df(d)

推一下 g(k)

g(k)=k|df(d)=i=1nj=1m[k|gcd(i,j)]ijk=i=1nkj=1mk[gcd(i,j)=1]ijk=ki=1nkj=1mk[gcd(i,j)=1]ij

然后就和上面的一样了。

题目3: 题意同上,多组询问,T104,n,m107。(BZOJ 2693)

思路:

很明显我们需要优化上题。

上题我们得到的式子:

f(N,M)=d1μ(d)d2g(Nd,Md)

答案即为:

k=1nkf(nkmk)

现在我们将 f 展开,代入答案得到:

k=1nkf(nkmk)=k=1nkd1μ(d)d2g(ndkmdk)

关键转化:令 T=dk,将枚举 (d,k) 改为枚举 (T,d)

上式变为:

k=1nkd1μ(d)d2g(ndkmdk)=T=1nd|Tμ(d)d2Tdg(nTmT)=T=1ng(nTmT)Td|Tμ(d)d

h(T)=Td|nμ(d)d,这个函数是个积性函数,可以 O(n) 预处理出来前缀和。而 g(N,M) 是可以 O(1) 计算的。所以单次询问可以直接数论分块,时间复杂度 O(Tn)

转化非常关键!!!

题目4: 假设我们有一个集合 SZ+,求:

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

思路:

这其实是一类问题:P2257 YY的GCDS 是质数集合),HDU5663 Hillan and the girlS 是平方数集合)。

其实都是一个方法。

我们先推式子:

i=1nj=1m[gcd(i,j)S]=dSi=1nj=1m[gcd(i,j)=d]=dSi=1ndj=1md[gcd(i,j)=1]=dSi=1ndj=1mdk|i,k|jμ(k)=dSk1μ(k)i=1ndkj=1mdk1=dSk1μ(k)ndkmdk

然后,还是刚才的关键转化:(d,k) 换成 (d,T)

dSk1μ(k)ndkmdk=T=1nd|T,dSμ(Td)nTmT=T=1nnTmTd|T,dSμ(Td)

f(T)=d|T,dSμ(Td),显然可以预处理出来,时间复杂度低于 O(nloglogn),然后数论分块即可单次 O(n) 时间解决。

题目5: 多组询问,求:

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

P3312 [SDOI2014] 数表

思路:

同理,还是推式子,过程不写了,我们将原式化为:

d=1nσ(d)[σ(d)a]k1μ(k)ndkmdk

然后还是将 (d,k) 变为 (T,k) 可以变为:

T=1nnTmTd|T[σ(d)a]σ(d)μ(Td)

考虑到是多组询问,a 会变,我们将询问离线,按照 a 升序排序,然后依次将 σ(d) 从小到大加入贡献。

为了数论分块,我们要支持单点修改和区间查询,树状数组即可,时间复杂度 O(nloglognlogn)

题目6: 多组询问,求:

i=1nj=1md(ij)

d(n) 表示 n 的约数个数。(P3327 [SDOI2015] 约数个数和

思路:

首先,我们有一个关于 d(ij) 的公式:

d(ij)=x|iy|j[gcd(x,y)=1]

posted @   rlc202204  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示