前言
开始学省选算法了……
感觉莫比乌斯反演好厉害的样子,就先学习一下
一入反演深似海……
相关的东西太多了,以后会不定期更新
前置技能
莫比乌斯函数
莫比乌斯函数 μ(n) 的定义如下:
设
n=pk11⋅pk22…pkmm
显然, μ(n) 是积性函数: μ(x)μ(y)=μ(xy),x⊥y
那么我们就可以使用线性筛来得到 μ(n) :
void prepare(){
mu[1]=1;
for (int i=2;i<=N;i++){
if (!vis[i]) p[++p[0]]=i,mu[i]=-1;
for (int j=1;j<=p[0]&&i*p[j]<=N;j++){
vis[i*p[j]]=1;
if (i%p[j]==0) {mu[i*p[j]]=0;break;}
else mu[i*p[j]]=-mu[i];
}
}
}
狄利克雷卷积
定义:对于数论函数
f(n)
和
g(n)
,定义卷积运算
∗
为:
狄利克雷卷积的单位元为 e(x)=[x=1]
任何数论函数
f
满足
定义函数 I(x)=1 , id(x)=x
则有: I∗μ=e
这说明 μ 是 I 的逆元
又有:
那么可以得到 φ=id∗μ
莫比乌斯反演
对于
f(n),g(n)
满足:
则有莫比乌斯反演:
其实非常显然,把命题换成狄利克雷卷积的形式就是:
已知 f=g∗I ,求证 g=f∗μ
根据 I∗μ=e 直接证明了
应用
求gcd=k的个数
问题:求
这是莫比乌斯反演的入门题,非常经典
推导:
然后套用莫比乌斯反演:
然后就可以对 ⌊nkd⌋⌊mkd⌋ 分块求和了
然后就可以在 O(n√) 时间里解决每次询问( O(n) 预处理)
例题
YY的GCD
先考虑枚举质数p,答案就是:
设 T=pd ,考虑枚举 T ,则有:
如果能够预处理 ∑p|Tμ(Tp) 关于 T 的前缀和,前面的柿子就可以
其实可以暴枚 p
因为均摊每个质数是
所以预处理可以 O(n)