前言
- 最近在學習莫比烏斯反演,發現了一個基本上全部的有關莫比烏斯反演的題目,都涉及到一個小的知識點: 整除分塊。
- 因此,在學習莫比烏斯反演以前學會整除分塊是頗有必要的。
- 那麼,我就來介紹一下整除分塊這一內容
整除分塊
- 能夠用到整除分塊的形式,大體是這樣的:
\[\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\]
- 這個式子,\(O(n)\)計算是很是顯然的。但,有的時候由於多組數據的要求,可能\(O(n)\)並非正確的時間複雜度。那麼這個時候,咱們就有一種\(O(\sqrt{n})\)的作法。這就是:整除分塊!
- 對於每個\(\lfloor\frac{n}{i}\rfloor\)咱們能夠經過打表
(或理性的證實)能夠發現:有許多\(\lfloor\frac{n}{i}\rfloor\)的值是同樣的,並且它們呈一個塊狀分佈;再經過打表之類的各類方法,咱們驚喜的發現對於每個值相同的塊,它的最後一個數就是\(n/(n/i)\)。得出這個結論後,咱們就能夠作的\(O(\sqrt{n})\)處理了。
附一個整除分塊的代碼吧:
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}
與其餘函數的聯繫
- 有時候,可能推出來的式子不必定就是一個很裸的整除分塊,可能會與某些積性函數相乘,如:\(\mu,\varphi\)...... 這時候,咱們就須要對這些函數統計一個前綴和。由於,每當咱們使用整除分塊跳過一個區間的時候,其所對應的函數值也跳過了一個區間。因此此時,就須要乘上那一個區間的函數值。
- (固然,若是當出題人想要考考你的數論能力的話,這時就不是統計前綴和這麼簡單了。可能\(O(n)\)線篩都會TLE,那麼咱們就須要杜教篩了)
- (PS:關於杜教篩的內容,我沒過多久就會寫,那時候再填坑吧!)