我也不知道什麼是"莫比烏斯反演"和"杜教篩"

upd:正在寫一篇複習向的文章,以後貼連接,能夠做爲這篇文章的一個補充。
upd:寫好啦,戳這裏。新寫的這篇複習向文章QwQ,能夠當作一個補充來看吧。不過新寫的文章也有我新的理解吧。html

Part0

最近一直在搞這些東西
作了將近20道題目吧
也算是有感而發
寫點東西記錄一下本身的感覺函數

若是您真的想學會莫比烏斯反演和杜教篩,請拿出紙筆,每一個式子都本身好好的推一遍,理解清楚每一步是怎麼來的,而且本身好好思考。spa

Part1莫比烏斯反演

莫比烏斯反演啥都沒有,就只有兩個式子(通常只用一個)
原來我已經寫過一次了,再在這裏寫一次
就只寫經常使用的那個吧rest

基本的公式


對於一個函數\(f(x)\)
\(g(x)=\sum_{x|d}f(d)\)
那麼
\[f(x)=\sum_{x|d}\mu(\frac{d}{x})g(d)\]htm


這個有什麼用?
彷佛太有用了一點blog

隨手搞道題目來講吧遞歸


\[\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]\]get

這個東西很直接,
因此咱們設\[f(x)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=x]\]
\[g(x)=\sum_{x|d}f(d)\]
根據莫比烏斯反演能夠獲得
\[f(1)=\sum_{1|d}\mu(\frac{d}{1})g(d)=\sum_{i=1}^n\mu(i)g(i)\]
\(g(x)\)是什麼東西?
\[g(x)=\sum_{i=1}^n\sum_{j=1}^m[x|gcd(i,j)]\]
直接把\(x\)除到上面去
\[g(x)=\sum_{i=1}^{n/x}\sum_{j=1}^{m/x}[1|gcd(i,j)]\]
\([1|gcd]\)顯然成立的
因此\(g(x)=[\frac{n}{x}][\frac{m}{x}]\)
能夠\(O(1)\)計算
因此,\(f(1)\)能夠\(O(n)\)計算博客


一塊兒推下式子

莫比烏斯反演的套路太多了class

咱們再來看兩道題目
Crash的數字表格
jzptab

這兩題按照順序看嗷

具體的過程直接看我博客裏面寫的東西

咱們發現這兩道題如出一轍
可是下面的那道題目能夠作到單次詢問\(O(\sqrt n)\)

他多幹了什麼???
這個問題,咱們本身再來從新推一下
不過找個容易點的東西


\[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\]

這個確定沒有前面我給的例子的莫比烏斯反演那麼直接
可是咱們觀察一下,\(gcd\)的取值有哪些??
\(1~n\)(假設\(n<m\))
那麼,咱們能夠把\(gcd\)相同的項合併

因此,咱們枚舉\(gcd\)的值
\[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=d]\]
後面的那一部分是否是想到了前面推出的東西???
因此先把\(d\)直接除上去
\[\sum_{d=1}^nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)=1]\]
\(n/d\)\(m/d\)不要想太多,你就當成\(x\)\(y\)
\[\sum_{i=1}^{x}\sum_{j=1}^{y}[gcd(i,j)=1]\]
不就是上面推過的第一個例子??
\[=\sum_{i=1}^x\mu(i)[\frac{x}{i}][\frac{y}{i}]\]

把這一截放回咱們要求的式子裏面去
\[\sum_{d=1}^nd\sum_{i=1}^{x}\mu(i)[\frac{x}{i}][\frac{y}{i}]\]
\(x,y\)仍是寫成原樣吧
\[\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)[\frac{n}{id}][\frac{m}{id}]\]

是否是\(n/d\)能夠數論分塊
而在計算後面的東西的時候,\(\frac{n/d}{i}\)也能夠數論分塊??
因此這個時候的複雜度是\(O(n)\)
與之相對應的就是上面Crash的數字表格\(O(n)\)作法

但是,像下面那個\(O(\sqrt n)\)是怎麼作的呢?

那咱們就繼續推一步
咱們是否是能夠直接對\(\frac{n}{id}\)分塊呢?
因此,咱們設\(T=id\)\(id\)換一下
\[\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)[\frac{n}{T}][\frac{m}{T}]\]
這個時候,比較關鍵的一步
\(T\)提出來
\[\sum_{T=1}^n[\frac{n}{T}][\frac{m}{T}]\sum_{d|T}d\mu(\frac{T}{d})\]
爲何是這個??
咱們來分析一波
首先每個\(T\)必定對應\([\frac{n}{T}][\frac{m}{T}]\)
這一項之和\(T\)有關,因此能夠提出來

這個時候考慮對於每個\(T\),什麼樣的\(i\)\(d\)會給他產生貢獻呢?
最顯然的一點,\(d\)\(T\)的一個因數
看到上面的式子,咱們不難發現會貢獻一個\(d\)的什麼東西
後面的是什麼?\(\mu(i)\)
繼續想一想,既然\(T=id\),咱們枚舉了一個\(T\)
又知道\(d\)\(T\)的一個因子了,因此\(i=\frac{T}{d}\)
因此,就有了上面把\(T\)拿出來的式子

前面的東西看起來能夠數論分塊
可是這樣子後面的東西怎麼辦?
不可能\(O(\sqrt n)\)暴力枚舉呀

沒錯,固然不須要暴力枚舉
咱們發現後面的東西也是一個積性函數(由於他是兩個積性函數的狄利克雷卷積)
因此它是能夠線性的篩出來的
到這裏,前面對於\(T\)數論分塊
後面的前綴和能夠\(O(n)\)線性篩預處理出來
此時單次詢問總體的複雜度就是\(O(\sqrt n)\)

對了,不要思想江化
後面那個東西若是不可以直接線性篩
那就不要線性篩了,
只要複雜度容許,暴力篩也是很能夠的


其實,若是咱們繼續觀察,很容易知道一點:
\(\sum_{d|T}d\mu(\frac{T}{d})=\varphi(T)\)

upd:原來底下的證實是假的,已經刪掉了,這裏用容斥的方法很容易證實,考慮到\(\mu\)是容斥係數就能夠很容易的知道上述式子的組合意義。

咱們知道\((1*\varphi)(i)=i\)
還知道\((1*\mu)(i)=e\)
其中\(1\)\(f(x)=1\)
\(e\)\(f(x)=[x=1]\)
\(id\)\(f(x)=x\)

因此這個東西固然能夠線性篩啦。


莫比烏斯反演差很少就到這裏啦
咱們經歷的複雜度從\(O(n^2)\)的暴力
推一步以後變成了\(O(n)\)
再變成了\(O(\sqrt n)\)

莫比烏斯反演的關鍵步驟也就是兩步
首先是化簡式子,寫成莫比烏斯反演的形式
而後就是怎麼處理前綴和,數論分塊等東西的問題

這些可以解決好,莫比烏斯反演的題目就很好解決啦

Part2線性篩

固然是怎麼各類線性篩東西啦

線性篩最重要的一點:
每一個數必定,也只會,被他的最小質因子給篩到
說白點,好比說\(72=2*2*2*3*3\)
他就會被他的最小質因子給篩到
也就是\(2*36\)時被篩到

因此,通常線性篩若是要存儲其餘的東西來篩的話
必定是記錄最小質因子的東西

大概的寫一下幾個積性函數:

\(\mu\)莫比烏斯函數

這個怎麼篩應該都會吧

\(\varphi\)歐拉函數

怎麼篩應該也很明顯吧。

\(d\)約數個數

這個怎麼篩?
考慮惟一分解定理:
\(x=\prod p_i^{ai}\)
那麼\(d(x)=\prod (ai+1)\)
記錄一下最小質因子的個數
每次就先把原來的除掉,再把\(+1\)後的個數乘上就好啦

\(\sigma\)約數和

仍是惟一分解定理
\(x=\prod p_i^{ai}\)
\(\sigma(x)=\prod (\sum_{j=0}^{ai}p_i^j)\)
記錄一下最小質因子的上面那個式子的和
以及這個因子的\(ai\)次冪
每次也是先除掉再乘上新的

\(a^k\) \(k\)次冪

把這個東西寫進來,只是爲了提醒一下
\(a^k\)這種東西是一個徹底積性函數,也是能夠丟進去篩的

\(inv\)乘法逆元

沒啥,同樣的,乘法逆元也是徹底積性函數
蛤,我知道能夠\(O(n)\)遞推
只是寫一下而已


我比較懶,不想把板子蒯過來
直接把ppl的連接給大家嗷(雖然他的代碼風格我以爲很醜)

Part3杜教篩

來個栗子

線性篩\(O(n)\)複雜度,美滋滋
好的,我知道了
來一個很\(interesting\)的題目???

\[求\sum_{i=1}^n\mu(i)的值\]

我固然知道你會線性篩
因此\(n<=10^9\)

杜教篩是蛤?

好比說。。
咱們如今要求一個積性函數\(f(i)\)的前綴和\(S(i)\)
也就是說\(S(n)=\sum_{i=1}^nf(i)\)

如今很很差算呀
怎麼辦??

這個時候,就來杜教篩套路一波

我再來找個積性函數\(g(i)\)(不知道是啥)
\(g\)\(f\)作一個卷積
\[(g*f)(i)=\sum_{d|i}g(d)f(\frac{i}{d})\]
再求一下卷積的前綴和
\[\sum_{i=1}^n(g*f)(i)=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})\]
\(d\)給提出來
\[\sum_{d=1}^ng(d)\sum_{d|i}f(\frac{i}{d})\]
\[\sum_{d=1}^ng(d)\sum_{i=1}^{n/d}f(i)\]
\[\sum_{d=1}^ng(d)S(\frac{n}{d})\]
若是仔細想一想
咱們就會有這個式子:
\[g(1)S(n)=\sum_{i=1}^ng(i)S(\frac{n}{i})-\sum_{i=2}^ng(i)S(\frac{n}{i})\]
前面的東西是狄利克雷卷積
\[g(1)S(n)=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\]
若是狄利克雷卷積的前綴和很是好算的話
那麼咱們就能夠對後面的東西進行數論分塊
而後遞歸計算。
提醒一句:
必定要記憶化,必定要記憶化,必定要記憶化

回到栗子

\(\sum_{i=1}^n\mu(i)\)
把杜教篩的公式套路式子找過來蛤
\[g(1)S(n)=\sum_{i=1}^n(g*\mu)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\]
看到了\(\mu\)想一個積性函數,讓他們的狄利克雷卷積前綴和很好算
咱們知道
\[\sum_{d|i}\mu(d)=[i=1]=e\]
也就是說
\[(1*\mu)=e\]
\(e\)的前綴和是啥?
固然是\(1\)
因此,取\(g(x)=1\)
\[S(n)=1-\sum_{i=2}^nS(\frac{n}{i})\]
這樣子的話,首先線性篩出一部分的\(\mu\)的前綴和
而後來一波記憶化搜索美滋滋


再來個栗子把
把上面的\(\mu\)換成\(\varphi\)
咱們仍是知道
\[\sum_{d|i}\varphi(d)=i=id(i)\]
因此,若是是\(\varphi\)的話
就令\(g(x)=1\)
因此,
\[S(n)=\frac{n*(n+1)}{2}-\sum_{i=2}^nS(\frac{n}{i})\]

多好的套路

可是,不要被套路給套死啦
面對不一樣的函數
必定要考慮清楚\(g\)是啥
好的\(g\)能讓你的程序更加好算

Part4我也不知道爲何要加上這一部分

好啦
上面好好地寫了一下莫比烏斯反演和杜教篩
是否是以爲很簡單

固然,莫比烏斯反演和杜教篩固然能夠混在一塊兒

莫比烏斯反演推柿子
杜教篩求前綴和
一點也不矛盾


既然我也不知道最後這部分幹啥
那就找一堆題目來吧
歡迎查我水錶
算了
仍是把水錶給大家把
莫比烏斯反演的水錶
杜教篩的水錶


最後,說幾句話
不要由於有了杜教篩和線性篩
就每天想着怎麼篩
篩不了就滾去寫暴力
埃氏篩法很不錯
暴力枚舉因數也很不錯

最後,一句最經典的話做爲結尾

騙分過樣例,暴力出奇跡

相關文章
相關標籤/搜索