莫比烏斯反演
(PS:在評論區中眾多dalao的催促下,我認真的寫了三天三夜寫完了這篇杜教篩,保證是精品!)
前言
(這大概是我第一次寫學習筆記吧OvO)
可能每一個剛開始接觸莫比烏斯反演的OIer,起初都會厭惡這個神奇的東西。(我也一樣233)每一個人厭惡的原因有許多,可能是這個煩人的式子,也可能僅僅只是因為不理解\(\mu\)函數而感到不爽。當然,莫比烏斯反演有一個小小的預備知識:整除分塊
那么我們先從莫比烏斯反演中最基礎的莫比烏斯函數\(\mu\)開始說起:
莫比烏斯函數
- 首先,我們可以先明確一點,莫比烏斯函數並不是什么很高大上的東西,它其實只是一個由容斥系數所構成的函數。\(\mu(d)\)的定義是:
- 當\(d=1\)時,\(\mu(d)=1\);
- 當\(d=\Pi_{i=1}^{k}p_i\)且\(p_i\)為互異素數時,\(\mu(d)=(-1)^k\)。(說直白點,就是\(d\)分解質因數后,沒有冪次大於平方的質因子,此時函數值根據分解的個數決定);
- 只要當\(d\)含有任何質因子的冪次大於等於2,則函數值為0.
- 當然,莫比烏斯函數也有很多有趣的性質:
- 對於任意正整數\(n\),\(\sum_{d|n}\mu(d)=[n=1]\)。(\([n=1]\)表示只有當\(n=1\)成立時,返回值為\(1\);否則,值為\(0\);(這個就是用\(\mu\)是容斥系數的性質可以證明)(PS:這一條性質是莫比烏斯反演中最常用的)
- 對於任意正整數\(n\),\(\sum_{d|n}\frac{\mu(d)}{d}=\frac{\phi(n)}{n}\)。(這個性質很奇妙,它把歐拉函數和莫比烏斯函數結合起來,或許我之后寫杜教篩的學習筆記時會去證明吧)
- 程序實現並不難,我們可以在線性篩素數的程序上略作修改,便可以篩出\(\mu\)函數。
- 那我還是給一段線篩的代碼吧
void get_mu(int n)
{
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i]){prim[++cnt]=i;mu[i]=-1;}
for(int j=1;j<=cnt&&prim[j]*i<=n;j++)
{
vis[prim[j]*i]=1;
if(i%prim[j]==0)break;
else mu[i*prim[j]]=-mu[i];
}
}
}
- 那么,莫比烏斯函數就這么告一段落了。
莫比烏斯反演
- 解決完莫比烏斯函數的問題后,我們便迎來了重頭戲莫比烏斯反演
- 定理:F(n)和f(n)是定義在非負整數集合上的兩個函數,並且滿足條件:
\[F(n)=\sum_{d|n}f(d) \]
那么存在一個結論:
\[f(n)=\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor) \]
這個定理就稱作莫比烏斯反演定理。
- 莫比烏斯反演的證明主要有兩種方式,其中一種就是通過定義來證明;另外一種,我則是會在杜教篩中提到(利用狄利克雷卷積)。那么我先來說一說第一種證明方法:
\[\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor)=\sum_{d|n}\mu(d)\sum_{i|\lfloor\frac{n}{d}\rfloor}f(i) \]
\[=\sum_{i|n}f(i)\sum_{d|\lfloor\frac{n}{i}\rfloor}\mu(d)=f(n) \]
(PS:如果不知道最后一步怎么來的,可以再去看性質一,至於和式的變換,就自己腦補一下吧)
- 當然,莫比烏斯反演有另外的一種形式,當\(F(n)\)和\(f(n)\)滿足:
\[F(n)=\sum_{n|d}f(d) \]
可以推出:
\[f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) \]
- 感覺這個式子,可能在莫比烏斯反演中更加好用。
那么,莫比烏斯反演的基本內容就說完了。知道了這些內容,就已經可以解決一些有關的問題了。我做了一些關於莫比烏斯反演的題,具體題解可以看看我博客中的內容。
題目
YY的gcd
[POI2007]ZAP-Queries
[SDOI2015]約數個數和
[HAOI2011]Problem b
洛谷P1829 [國家集訓隊]Crash的數字表格
(未完,待更新)