莫比乌斯函数及其反演学习笔记
——by sunzz3183
定义
μ(x)≡⎧⎨⎩1x=1(−1)kx=p1⋅p2⋅⋯⋅pk0otherwise
求法
- 直接求
inline int mu(int x){
if(!x)return 0;
if(x==1)return 1;
int sum=0;
for(int i=2;i*i<=x;i++)
if(!(x%i))
if(!(x/i%i))return 0;
else sum++;
return sum&1?-1:1;
}
- 线性筛
int cnt,prime[M],phi[N],mu[N];
bool is_p[N];
void init(int n){
phi[1]=mu[1]=1;
for(int i=2;i<=n;i++){
if(!is_p[i])prime[++cnt]=i,phi[i]=i-1,mu[i]=-1;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
is_p[i*prime[j]]=1;
if(!(i%prime[j])){
phi[i*prime[j]]=phi[i]*prime[j];
mu[i*prime[j]]=0;
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
mu[i*prime[j]]=-mu[i];
}
}
}
(根据性质,很简单)
反演
式子 1
∑d∣nμ(d)=[n=1]
证明
设 P=p1p2…pk,即要证明:
∑d|Pμ(d)=0
∑d|Pμ(d)=∑d|p1μ(d)=μ(p1)+1=1−1=0
- 现在设 t≥2 而当 k=1,…,t−1 时式子都成立,则
∑d|Pμ(d)=∑d|p1…pt−1μ(d)+∑pt|d|Pμ(d)=(1+μ(pt))∑d|p1…pt−1μ(d)=0
故当 k=t 时式子也成立。
由数学归纳法得,式子对于任意的整数 k 都成立。
现在令 n=pc11…pckk,由于当 d 能被质数的平方整除时 μ(d)=0 所以:
∑d|nμ(d)=∑d|nμ(P)=0
综上,原式成立。
式子 1.5
设 n=pc11…pckk 则:
∑d∣n|μ(d)|=2k
证明
类比上述证明,要证原式,即证(沿用上次定义的字母):
∑d|P|μ(d)|=2k
∑d|p1=1+|μ(p1)|=21
- 现在设 t≥2 而当 k=1,…,t−1 时式子都成立,则
∑d|P|μ(d)|=∑d|p1…pt−1|μ(d)|+∑pt|d|P|μ(d)|=(1+|μ(pt)|)∑d|p1…pt−1μ(d)=2t
故当 k=t 时式子也成立。
由数学归纳法得,式子对于任意的整数 k 都成立。
式子 2
[gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)
由式子 1 得
式子 3
n∑i=1m∑j=1[gcd(i,j)=1]=n∑i=1m∑j=1∑d|gcd(i,j)μ(d)=n∑i=1min(i,m)∑d=1μ(d)⌊min(i,m)d⌋=min(n,m)∑d=1μ(d)⌊nd⌋⌊md⌋
式子 4
例题 [POI2007]ZAP-Queries
n∑i=1m∑j=1[gcd(i,j)=k]
我们可以转化和式子 3 一样的。
n∑i=1m∑j=1[gcd(i,j)=k]=⌊nk⌋∑i=1⌊mk⌋∑j=1[gcd(i,j)=1]=⌊nk⌋∑i=1⌊mk⌋∑j=1∑d|gcd(i,j)μ(d)=⌊min(n,m)k⌋∑d=1μ(d)⌊nd×k⌋⌊md×k⌋
式子 5
n∑i=1m∑j=1[gcd(i,j)≤x]
转化成式子 4。
n∑i=1m∑j=1[gcd(i,j)≤x]=n∑i=1m∑j=1x∑k=1[gcd(i,j)=k]=x∑k=1n∑i=1m∑j=1[gcd(i,j)=k]=x∑k=1⌊min(n,m)k⌋∑d=1μ(d)⌊nd×k⌋⌊md×k⌋
求法总结
线性筛 O(n) 求,然后直接求的话也会是 O(n),可以使用整数分块和前缀和来使时间优化到 O(√n)。
应用
例 1
ϕ(n)=∑d∣nμ(d)nd
证明
即证明 ϕ=μ∗Id→Id=I∗ϕ
ld=n∑i=1n∑j=1[gcd(i,n)=j]=∑j|n⌊nj⌋∑i=1[gcd(i∗j,n)=j]=∑j|n⌊nj⌋∑i=1[gcd(i,nj)=1]=∑j|nϕ(nj)=I∗ϕ
例 2
[SDOI2015] 约数个数和
d(x) 为 x 的因数个数。
d(xy)=∑i|x∑j|y[gcd(i,j)=1]
证明
证明可以考虑映射,或者感性理解,每个质因子要被保证枚举 pxi+pyi 次,所以要 gcd(i,j)=1。
例 3
[国家集训队] Crash的数字表格
n∑i=1m∑j=1i⋅jgcd(i,j)
n∑d=1d⋅⌊nd⌋∑i=1⌊md⌋∑j=1[gcd(i,j)=1]⋅i⋅j
n∑k=1k⌊nk⌋∑d=1μ(d)⋅d2⋅⌊ndk⌋∑i=1⌊mdk⌋∑j=1i⋅j
用 T 替换 dk。
n∑T=1T∑d|Tμ(d)⋅d⋅⌊nT⌋∑i=1⌊mT⌋∑j=1i⋅j
设 f(T)=∑d|Tμ(d)⋅d,这是一个积性函数,故原式子可以 O(√n)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】