整除分块学习笔记

整除分块

\(\lfloor\frac{n}{i}\rfloor\) 的值将整数分组,前提是按照整除分组之后在同一组的数字,其产生的贡献相同。

Template

inline void calc()
{
    for(int l=1,r;l<=n;l=r+1)
    {
        int val=n/l;
        r=n/val;    
        ans+=(r-l+1)*f[val];
    }
}

复杂度证明

整除分块的复杂度是 \(O(\sqrt{n})\) ,证明如下:
由上面的代码可以知道,对于一个值域块的计算是 \(O(1)\) 的。
那么最后的复杂度实际上仅仅取决于块的数量,考虑怎么数块的数量。
\(i<\sqrt{n}\) 的时候,\(\lfloor\frac{n}{i}\rfloor\) 最多只有 \(\sqrt{n}\) 种取值,因为 \(i\) 最多只有 \(\sqrt{n}\) 种取值;
\(i\ge\sqrt{n}\) 的时候,\(\lfloor\frac{n}{i}\rfloor\) 必定小于 \(\sqrt{n}\) ,这时也最多只有 \(\sqrt{n}\) 种取值。
所以最后的复杂度就是 \(O(\sqrt{n})\)

posted @ 2025-04-23 11:25  Hanggoash  阅读(30)  评论(0)    收藏  举报
动态线条
动态线条end