1. 程式人生 > >【持續更新】莫比烏斯反演簡明教程

【持續更新】莫比烏斯反演簡明教程

前言

開始學省選演算法了……

感覺莫比烏斯反演好厲害的樣子,就先學習一下

一入反演深似海……

相關的東西太多了,以後會不定期更新

前置技能

莫比烏斯函式

莫比烏斯函式μ(n)的定義如下:

n=pk11pk22pkmm

μ(n)=1(1)m0n=1mi=1ki=1otherwise(ki>1)
顯然,μ(n)是積性函式:μ(x)μ(y)=μ(xy),xy

那麼我們就可以使用線性篩來得到μ(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),定義卷積運算為:

(fg)(n)=d|nf(d)g(nd)
狄利克雷卷積的單位元為e(x)=[x=1]

任何數論函式f滿足f

e=f

定義函式I(x)=1id(x)=x

則有:Iμ=e

這說明μI的逆元

又有:φI=id

那麼可以得到φ=idμ

莫比烏斯反演

對於f(n),g(n)滿足:

f(n)=d|ng(d)
則有莫比烏斯反演:
g(n)=d|nf(d)μ(nd)
其實非常顯然,把命題換成狄利克雷卷積的形式就是:

已知f=gI,求證g=fμ

根據Iμ=e直接證明了

應用

求gcd=k的個數

問題:求

i=1nj=1m[gcd(i,j)=k]
這是莫比烏斯反演的入門題,非常經典

推導:

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

然後套用莫比烏斯反演:
i=1nkj=1mkd|(i,j)