整除分块学习笔记
整除分块
以 \(\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})\) 。
为什么要练,为什么要写?
引用一句让我幡然悔悟的话:
“练了不一定写的出来正解,不练一定写不出来正解”
本文来自博客园,作者:Hanggoash,转载请注明原文链接:https://www.cnblogs.com/Hanggoash/p/18842440

浙公网安备 33010602011771号