1. 程式人生 > >整除分塊

整除分塊

跳過 就會 += 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:關於杜教篩的內容,我沒過多久就會寫,那時候再填坑吧!)

整除分塊