莫比烏斯反演在競賽中屬於數論的內容。雖然說,本系列是想寫面向beginner的教程,但是莫比烏斯反演在數論中並不是很基礎的內容,你仍然需要有一定的數論知識的基礎。
ps:以下**都是寫部落格的時候現場手打的,所以。。。
本文只講數論分塊並給出線性篩法的模版。其他內容請自行搜尋學習。
這裡給出線性素數篩:
int prime[maxn], numprime, isprime[maxn]; // isprime[i] == 0:i是素數,反之則不是。prime用來存素數
void make_prime(const int &up_bound) }}
求:
\[\sum\limits_^\left\lfloor \dfrac \right\rfloor
\]如果告訴你,\(1 \leq k \leq n \leq 10^6\),那麼,你可以直接列舉。那,如果告訴你,\(1 \leq k \leq n \leq 10^\)呢?
這就要用到數論分塊了。數論分塊能把複雜度降到\(o(\sqrt)\)。原理如下:
我們看幾個整數除法的例子:
\(\left\lfloor \dfrac \right\rfloor = 2, \left\lfloor \dfrac \right\rfloor = 2, \left\lfloor \dfrac \right\rfloor = 1, \left\lfloor \dfrac \right\rfloor = 1 \cdots\)
容易發現,總是有這麼一段,它們做除法的結果是一樣的。比如從\(4\)到\(5\),除法的結果總是\(2\);從\(6\)到\(10\),除法的結果總是\(1\)。
它在圖上表示出來是這樣的:
如果我們能把它相等的這一段,直接用乘法求出來,顯然會比挨個做加法要快不少。那麼,我們如何確定某一段的左右邊界呢?
先說結論,最後再說證明。結論很漂亮,但是證明很蛋疼。
\(x = \left\lfloor \dfrac \right\rfloor\)的右邊界是\(\left\lfloor \dfrac \rfloor} \right\rfloor\)。
也就是說,對於\(n\)來說,如果\(\left\lfloor \dfrac \right\rfloor = x\),那麼令\(r = \left\lfloor \dfrac \rfloor} \right\rfloor\),則\(\left\lfloor \dfrac \right\rfloor\)也等於\(x\)。且\(r\)是\(\left\lfloor \dfrac \right\rfloor = x\)的右邊界,\(\left\lfloor \dfrac \right\rfloor\)就不等於\(x\)了。
那麼,這一段的求和就是\(\left(\left\lfloor \dfrac \rfloor} \right\rfloor - l + 1 \right) \times \left\lfloor \dfrac \right\rfloor\)。
上面提到的例題,**如下:
for (int l = 1, r; l <= k; l = r + 1)
十分簡潔。
在不同的地方應用數論分塊寫起來會有點不同,不過總體上大同小異。
如果我們要求\(\sum\limits_^\left\lfloor \dfrac \right\rfloor \left\lfloor \dfrac \right\rfloor\)呢?
這裡會遇到的乙個問題就是\(\left\lfloor \dfrac \right\rfloor\)和\(\left\lfloor \dfrac \right\rfloor\)的右邊界可能不同。所以,我們只要把這個分段再「切碎一點」就好了。
for (int l = 1, r; l <= k; l = r + 1)
摘自:oi-wiki
ps:稍微吐槽一下oi-wiki,oi-wiki寫的內容是很完備而且嚴謹的,所以對於初學來說反而有點痛苦。。。
pss:建議做一做oi-wiki推薦的習題試試: 「luogu p2261」cqoi2007 餘數求和
對於任意給定的\(i\),我們要找乙個最大的\(j\),滿足\(\left\lfloor \dfrac \right\rfloor = \left\lfloor \dfrac \right\rfloor\)。
首先,我們證明\(\left\lfloor \dfrac \right\rfloor} \right\rfloor \geqslant i\):
\[\begin & \left\lfloor \dfrac \right\rfloor \leqslant \dfrac \\ \longrightarrow & \left\lfloor \dfrac \rfloor} \right\rfloor \geqslant \left\lfloor \dfrac} \right\rfloor = \lfloor i \rfloor = i \\ \longrightarrow & i \leqslant \left\lfloor \dfrac \rfloor} \right\rfloor = j \end
\]下證明:\(\left\lfloor \dfrac \right\rfloor} \right\rfloor\)是滿足條件的最大的\(j\)。
設\(k = \left\lfloor \dfrac \right\rfloor\),那麼,必然有\(\left\lfloor \dfrac \right\rfloor = k\),顯然,\(j\)的最大值是\(\left\lfloor \dfrac \right\rfloor\)
;(有一說一,我確實覺得挺顯然的)
\(\left\lfloor \dfrac \right\rfloor = k \longleftrightarrow k \leqslant \dfrac < k + 1 \longleftrightarrow \dfrac < \dfrac \leqslant \dfrac \longleftrightarrow \dfrac < j \leqslant \dfrac\)
又因為\(j\)是整數,所以\(j_ = \left\lfloor \dfrac \right\rfloor\)
莫比烏斯函式 反演 杜教篩 小結
1 莫比烏斯函式 反演 ppt bzoj 2440 莫比烏斯函式基礎應用 容斥 bzoj 2301 反演基本應用 bzoj 2820 質數個數o n logn 均攤o logn 總的列舉質數倍數o n 待補 bzoj 3529 推式子 離線排序插入 bzoj 2154 推式子 bzoj 2693 同...
尤拉篩(線性篩)求莫比烏斯函式
篩法我們肯定都不陌生,用來求一定序列內素數個數的方法麻,但在學習完埃氏篩法後 如果沒學過可以去學一下再看 我們發現它似乎做了很多多餘的操作,乙個數會被他的質所有篩 一遍,但我們本質上篩一遍就夠了,所以我們有沒有什麼方法去優化它呢?尤拉篩隨之而出,尤拉篩的特點便是乙個數隻會被它的最小質因子篩一遍,其它...
線性篩素數 尤拉函式 莫比烏斯函式
常用的兩種素數篩法見部落格 http 這裡詳講線性篩,演算法複雜度o n 這個演算法的核心思想是 每乙個合數可以被唯一地表示成它的乙個最小質因子和另外乙個數的乘積。證明略。先上 const int n 1000000 int phi n prime n mu n bool vis n void in...