整除分塊
阿新 • • 發佈:2018-03-28
跳過 就會 += splay http source 能力 var OS
前言
- 最近在學習莫比烏斯反演,發現了一個基本上所有的有關莫比烏斯反演的題目,都涉及到一個小的知識點: 整除分塊。
- 所以,在學習莫比烏斯反演之前學會整除分塊是很有必要的。
- 那麽,我就來介紹一下整除分塊這一內容
整除分塊
- 可以用到整除分塊的形式,大致是這樣的:
\[\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:關於杜教篩的內容,我沒過多久就會寫,那時候再填坑吧!)
整除分塊