莫比乌斯函数和莫比乌斯反演

前置技能

基础数论内容。

莫比乌斯函数

μ(n)就是莫比乌斯函数,如果有:

n=i=1mpxiai(ai>0)

那么:

μ(n)={1n=1(1)mai10other

莫比乌斯函数有一个很重要的性质,那就是
d|nμ(d)=[n=1]

证明:n=1时显然。

n=2时考虑有一个ai>1时显然对答案没有影响,那么答案就是i=0n(1)i(nk),这个显然等于0

莫比乌斯反演

若有

f(x)=d|xg(d)


g(x)=d|xf(d)μ(xd)

然而不知道有啥用……

例题

BZOJ 2301

其实就是求

i=abj=cd[gcd(i,j)=k]

二维差分一下,这个就等价于求
i=1nj=1m[gcd(i,j)=k]i=1n/kj=1m/k[gcd(i,j)=1]

i=1nμ(n)=[n=1]

i=1n/kj=1m/kd|i,d|jμ(d)

优先枚举d
d=1n/kμ(d)i=1n/dkj=1n/dk1

发现后面的一部分其实就是ndkmdk,因此式子就变成了
d=1n/kμ(d)ndkmdk

发现最后面的取值只有O(n)种,因此可以数论分块得到单次O(n)

BZOJ 4407

i=1nj=1mgcd(i,j)k

枚举gcd(i,j)

d=1ndki=1nj=1m[gcd(i,j)=d]d=1ndki=1n/dj=1m/d[gcd(i,j)=1]

发现后面是不是很熟悉?再一次用到那个神奇的公式
d=1ndki=1n/dj=1m/dx|i,x|jμ(x)

x提前
d=1ndkx=1n/dμ(x)i=1n/dxj=1m/dx1d=1ndkx=1n/dμ(x)ndxmdx

f(d)=dkx=1n/dμ(x),则
d=1nf(d)ndxmdx

显然f(d)是一个积性函数,那么我们先线筛出f(d),对f(d)做前缀和,就可以做到单次O(n)的复杂度了。

杜教筛

前置技能

莫比乌斯反演?

杜教筛

一个积性函数f(x),怎么求前缀和S(x)=i=1xf(x)

我们找一个积性函数g(x)(不知道它是啥),将它与f(x)做一遍卷积:

(fg)(n)=d|nf(d)g(nd)

将卷积做一遍前缀和:
i=1n(fg)(i)=i=1nd|if(d)g(id)=i=1nd|ig(d)f(id)

后面的部分可以变成
d=1ng(d)i=1n/df(i)d=1ng(d)S(nd)

因此
i=1n(fg)(i)=d=1ng(d)S(nd)

移项

g(1)S(n)=i=1n(fg)(i)d=2ng(d)S(nd)

观察到等式右边第一项就是fg的前缀和,第二项中S(nd)的取值最多只有O(n)种。

所以,如果fg很好求,g的前缀和很好求,那么我们就可以很快的递归求出S(n)的值。

一般是打表算出前几项,然后递归算,注意一定要记忆化(hash/map均可)。

莫比乌斯函数的前缀和?

由于

d|nμ(d)=[n=1]

因此我们取g(x)=1,直接代入式子:
S(n)=1d=2nS(nd)

欧拉函数?

由于

d|nφ(d)=n

因此取g(x)=1
S(n)=n×(n+1)2d=2nS(nd)

总结

这些题大概都有套路?推式子的方法感觉都差不多……