莫比烏斯反演

莫比烏斯反演

(PS:在評論區中衆多dalao的催促下,我認真的寫了三天三夜寫完了這篇杜教篩,保證是精品!)html

前言

(這大概是我第一次寫學習筆記吧OvO)
可能每個剛開始接觸莫比烏斯反演的OIer,起初都會厭惡這個神奇的東西。(我也同樣233)每個人厭惡的緣由有許多,多是這個煩人的式子,也可能僅僅只是由於不理解\(\mu\)函數而感到不爽。固然,莫比烏斯反演有一個小小的預備知識:整除分塊
那麼咱們先從莫比烏斯反演中最基礎的莫比烏斯函數\(\mu\)開始提及:函數

莫比烏斯函數

  • 首先,咱們能夠先明確一點,莫比烏斯函數並非什麼很高大上的東西,它其實只是一個由容斥係數所構成的函數。\(\mu(d)\)的定義是:
  1. \(d=1\)時,\(\mu(d)=1\)
  2. \(d=\Pi_{i=1}^{k}p_i\)\(p_i\)爲互異素數時,\(\mu(d)=(-1)^k\)。(說直白點,就是\(d\)分解質因數後,沒有冪次大於平方的質因子,此時函數值根據分解的個數決定);
  3. 只要當\(d\)含有任何質因子的冪次大於等於2,則函數值爲0.
  • 固然,莫比烏斯函數也有不少有趣的性質:
  1. 對於任意正整數\(n\)\(\sum_{d|n}\mu(d)=[n=1]\)。(\([n=1]\)表示只有當\(n=1\)成立時,返回值爲\(1\);不然,值爲\(0\);(這個就是用\(\mu\)是容斥係數的性質能夠證實)(PS:這一條性質是莫比烏斯反演中最經常使用的)
  2. 對於任意正整數\(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的數字表格

(未完,待更新)spa

相關文章
相關標籤/搜索