數論分塊


前言

最近在學莫比烏斯反演,然而只看懂了莫比烏斯函數,然后反演看着一臉懵逼,最后只看懂了數論分塊里面的一個分支內容(也是莫比烏斯反演的前置姿勢),整除分塊。
於是寫一篇博文記錄一下整除分塊
也稱數論分塊
數論分塊是莫比烏斯反演一個很重要的的前置知識(基本都要用到這個玩意)
已經看完莫反啦,打算寫一篇博客來記錄一下莫反。

整除分塊

整除分塊是用於快速處理形似

\[\sum_{i=1}^{n}{\lfloor \frac{n}{i} \rfloor} \]

的式子的方法
很顯然,這個可以\(O(n)\)得到答案。但是,在某些題目中,毒瘤出題人將數據加強到了\(10^{10}\)以上,這個時候我們就無法通過\(O(n)\)的解法來得到答案了。我們需要一個\(O(\sqrt{n})\)的更為優秀的解法
首先觀察這個式子,找幾個特殊值代入
n=5時,sum=5+2+1+1+1
可以發現的是:(這里給的例子並不明顯,其實應該找一個大的n來代入才直觀,讀者可以自行嘗試)
對於單一的\(\lfloor \frac{n}{i} \rfloor\),某些地方的值是相同的,並且呈塊狀分布
通過進一步的探求規律與推理以及打表與瞎猜,我們可以驚喜的發現一個規律,這些塊狀分布的值是有規律的
對於一個塊,假設它的起始位置的下標為l,那么可以得到的是,它的結束位置的下標為\(\lfloor \frac{n}{\lfloor \frac{n}{l}\rfloor} \rfloor\)
如果實在看的有點懵逼,可以繼續采用代入特殊值的方法,驗證一下上方的規律,用程序表現出來即為

//l為塊的左端點,r為塊的右端點
r=n/(n/l)

在實際應用中,需要注意的就是除法除0的問題(一般都需要特判一下n/l)
程序實現也十分簡單

int ans = 0;
for(int l = 1, r = 0; l <= n; l++) {
    r = n / (n / l);
    // do something
}

實際應用

例題:BZOJ1257: [CQOI2007]余數之和

這題其實就是求

\[\sum_{i=1}^{n}{k\space mod\space i} \]

這題和整除分塊又有什么關系呢?
mod沒有什么特殊的性質,所以我們將它展開來,就變成了

\[\sum_{i=1}^{n}{k\space-\lfloor \frac{k}{i} \rfloor*i} \]

於是我們就看到了一個熟悉的形式,也就是整除分塊的一般形式

再次改一下這個式子

\[n*k-\sum_{i=1}^{n}{\lfloor \frac{k}{i}\rfloor*i} \]

那么\(\sum_{i=1}^{n}{\lfloor \frac{k}{i}\rfloor*i}\)和普通的整除分塊有什么差別呢?

其實就是多了一個i

確實,就是多了一個i而已,只需要簡單的化簡一下,這個i就對我們的處理沒有什么影響了

因為我們知道,對於一個整除分塊\(\sum_{i=l}^{r}{\lfloor\frac{k}{i}\rfloor}\),其中的每個值都是相同的,於是我們可以設\(T=\lfloor\frac{k}{i}\rfloor\)

式子就化為了

\[\sum_{i=l}^{r}T*i \\ =\sum_{i=l}^{r}{T}*\sum_{i=l}^{r}i \]

也就是說,其實這個式子前半段是一個整除分塊,后半段是一個首項為l,公差為1的等差數列

至此,我們就圓滿的解決了這個問題,可以在\(O(\sqrt{n})\)的時間內解決本題

這是整除分塊中最基礎的應用,就是單純的利用整除分塊來加速遞推的實現,而實際上,整除分塊更多的與其他函數結合在一起來使用,優化問題的求解

整除分塊與積性函數

說到積性函數,就不得不講到兩個廣為人知的函數\(\phi,\mu\),這是我們最熟悉的積性函數(其實我也只知道這兩個)
積性函數有一個很好用的性質(設\(f(i)\)為一個積性函數):

\[f(i*j)=f(i)*f(j) \]

這里的\(f(i)\)其實是一個完全積性函數。(\(\phi\)就不是一個完全積性函數:\(\phi(i*j)=\phi(i)*\phi(j)\)當且僅當i,j互質才成立)
好了,講完積性函數的這個性質后我們步入正題,整除分塊與積性函數的聯系
很多時候,我們推出來整除分塊的式子不是很裸的,常與其他函數結合(通常是積性函數,通常為\(\mu\)\(\phi\)
這個時候如何統計答案呢?
比如:

\[\sum_{i=1}^{n}{\mu(i)*\lfloor \frac{n}{i}\rfloor} \]

積性函數的性質!
因為積性函數這個很好用的性質,所以我們可以直接對前半段的莫比烏斯函數維護一個前綴和,再利用整除分塊處理式子的后半段,處理答案的時候,把兩段相乘即可

例題

BZOJ2956: 模積和


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM