莫比乌斯函数入门

μ(n)={1n=10n(1)kkn

这个答辩似乎看不懂……不如换个形式去描述一下。
μ(1)=1 是初值,没啥好介绍的。
n 写为 i=1kpici,如果 maxck>1 那么 μ(n)=0
否则 μ(n)=(1)k
感觉讲得很清楚了 QwQ


由于莫比乌斯也是高贵的积性函数,和 φ(n)f(n)=gcd(k,n)d(n)σ(n) 这类都可以线性筛预处理:

mu[1]=1;
for(int i=2;i<N;i++){
if(!pr[i])pt+=i,mu[i]=-1;
for(int j:pt){
if(i*j>=N)break;
pr[i*j]=true;
if(i%j==0)break(mu[i*j]=0)
mu[i*j]=-mu[i];
}
}

看着这个莫比乌斯就很想容斥的样子,那就给个例题?

i=1nμ2(i)

虽然可以线性筛直接筛出来去计算,但还是太慢了,需要 O(n) 的复杂度。
发现只需要去计算不为 0 的数量就可以了,其他 ±1 的平方都是 1
那么就可以转化为 [1,n] 不包含平方因子的数量,也就是算 [1,n] 包含平方因子的数量。包含 22 的数量就是 n22;包含 32 的数量就是 n32;包含 42 的数量就是 n42,但是这个已经在 22 里算过了,没有贡献;包含 52 的数量就是 n52;包含 62 的数量就是 n62,可是在 2232 中算过了,反而要减去……;包含 302 的数量就是 n302 可是容斥一下反而是要加上的。发现其实这加减的系数就是莫比乌斯函数 μ

i=1nμ(i)ni2=i=1nμ(i)ni2

这样线性筛预处理就能做到 O(n),据说可以变成 O(n3)


dnμ(d)=ε(n)=[n=1]={1n=10n1

证明。把 n 写为 i=1kpici,那就是这些质因子自由组合弄出的倍数也就是 i=1kpici,ci[0,ci]
如果 ci>1,那么这个数的莫比乌斯函数必然为 0 无需考虑。那么也就是考虑每个 pi0 个还是选 1 个了。选择 1 个的总数就是 Ck1,每个的贡献是 1,选择 2 个的总数就是 Ck2,每个的贡献是 1……,选择 k 个的总数就是 Ckk,每个的贡献是 (1)k

i=0kCki×(1)i

这个东西可以使用二项式定理去证明。

0k=(11)k=i=0kCki×1k×(1)ki=i=0kCki×(1)i

不过当 n=1 时是例外,此时 d1μ(d)=1
很多时候会和 gcd 纠缠在一起呢。

dgcd(i,j)μ(d)=[gcd(i,j)=1]


那就来个题:

i=l1r1j=l2r2[gcd(i,j)=k]

通过二维前缀和的拆分就变成

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

发现必须 ki 并且 ki 所以只需要枚举 k 的倍数

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

根据莫比乌斯函数的性质可以变形

i=1nj=1mdgcd(i,j)μ(d)

这个 d 必须满足 dgcd(i,j) 也就是 di 并且 dj。要求 dmin(n,m) 所以直接计算对于所有 d[1,min(n,m)]

d=1min(n,m)μ(d)i=1n[di]i=1n[dj]

运用整除知识知道 i=1n[di] 就是 nd

d=1min(n,m)μ(d)ndmd

运用莫比乌斯函数前缀和与整除分块就可以 O(n) 的复杂度。


那就再来个题:

pPi=1nj=1m[gcd(i,j)=k]=pPd=1min(n,m)pμ(d)npdmpd

如果还是刚刚那个做法就需要 O(nnlnn),不妨记 k=pd

pPd=1min(n,m)pμ(d)nkmk

对于相同的 k 后半段是始终一样的,那就去提取后半段

k=1min(n,m)nkmkpk,pPμ(kp)

那么枚举每个 p 的倍数就可以算出后面那个东西。同样配合整除分块就可以 O(n) 解决。


莫比乌斯反演就是如果一个数论函数 f 可以拆成另一个数论函数 g,即

f(n)=dng(d)

那么就可以

g(n)=dnμ(d)f(nd)=ndμ(dn)f(p)

一般来说第一个用到的多点。

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