前言
最近在學莫比烏斯反演,然而只看懂了莫比烏斯函數,而後反演看着一臉懵逼,最後只看懂了數論分塊裏面的一個分支內容(也是莫比烏斯反演的前置姿式),整除分塊。 因而寫一篇博文記錄一下整除分塊 也稱數論分塊 數論分塊是莫比烏斯反演一個很重要的的前置知識(基本都要用到這個玩意) 已經看完莫反啦,打算寫一篇博客來記錄一下莫反。php
整除分塊
整除分塊是用於快速處理形似 $$ \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$ 若是實在看的有點懵逼,能夠繼續採用代入特殊值的方法,驗證一下上方的規律,用程序表現出來即爲html
//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} $$ 因而咱們就看到了一個熟悉的形式,也就是整除分塊的通常形式優化
再次改一下這個式子 $$ nk-\sum_{i=1}^{n}{\lfloor \frac{k}{i}\rfloori} $$ 那麼$\sum_{i=1}^{n}{\lfloor \frac{k}{i}\rfloor*i}$和普通的整除分塊有什麼差異呢?url
其實就是多了一個ispa
確實,就是多了一個i而已,只須要簡單的化簡一下,這個i就對咱們的處理沒有什麼影響了.net
由於咱們知道,對於一個整除分塊$\sum_{i=l}^{r}{\lfloor\frac{k}{i}\rfloor}$,其中的每一個值都是相同的,因而咱們能夠設$T=\lfloor\frac{k}{i}\rfloor$code
式子就化爲了 $$ \sum_{i=l}^{r}Ti \ =\sum_{i=l}^{r}{T}\sum_{i=l}^{r}i $$ 也就是說,其實這個式子前半段是一個整除分塊,後半段是一個首項爲l,公差爲1的等差數列htm
至此,咱們就圓滿的解決了這個問題,能夠在$O(\sqrt{n})$的時間內解決本題blog
這是整除分塊中最基礎的應用,就是單純的利用整除分塊來加速遞推的實現,而實際上,整除分塊更多的與其餘函數結合在一塊兒來使用,優化問題的求解
整除分塊與積性函數
說到積性函數,就不得不講到兩個廣爲人知的函數$\phi,\mu$,這是咱們最熟悉的積性函數~~(其實我也只知道這兩個)~~ 積性函數有一個很好用的性質(設$f(i)$爲一個積性函數): $$ f(ij)=f(i)f(j) $$ 這裏的$f(i)$實際上是一個徹底積性函數。($\phi$就不是一個徹底積性函數:$\phi(ij)=\phi(i)\phi(j)$當且僅當i,j互質才成立) 好了,講完積性函數的這個性質後咱們步入正題,整除分塊與積性函數的聯繫 不少時候,咱們推出來整除分塊的式子不是很裸的,常與其餘函數結合(一般是積性函數,一般爲$\mu$或$\phi$) 這個時候如何統計答案呢? 好比: $$ \sum_{i=1}^{n}{\mu(i)*\lfloor \frac{n}{i}\rfloor} $$ 積性函數的性質! 由於積性函數這個很好用的性質,因此咱們能夠直接對前半段的莫比烏斯函數維護一個前綴和,再利用整除分塊處理式子的後半段,處理答案的時候,把兩段相乘便可