整除分块
整除分块
整除分块是用来求这样的式子的:
\(\sum_{i=1}^{n}\lfloor\dfrac k i\rfloor\)
如果打出表会发现这个值是呈阶梯状下降的,然后他的取值最多有 \(2\sqrt n\) 种,所以只要能 \(O(1)\) 求出每个块的右边界,就可以将这个 \(O(n)\) 的式子优化到 \(O(\sqrt n)\)。
\(O(1)\) 求右边界的方法:
设左端点为 \(l\),\(t=\lfloor\dfrac k l\rfloor\),
- \(t\ne0,r=\min(\lfloor\dfrac k t\rfloor,n)\)
- \(t=0,r=n\)
证明:
先证明 \(r=\lfloor\dfrac k t\rfloor\) 时,\(\lfloor\dfrac k {\lfloor\frac k t\rfloor}\rfloor\) 大于等于 \(t\) 。
\(t=\lfloor\dfrac k l\rfloor\leq\dfrac k l\)
\(\lfloor\dfrac k {\lfloor\frac k t\rfloor}\rfloor\geq\lfloor\dfrac k { \frac k t}\rfloor=t\)
\(\lfloor\dfrac k {\lfloor\frac k l\rfloor}\rfloor\geq t\)
再证明 \(r=\lfloor\dfrac k t\rfloor+1\) 时,\(\lfloor\dfrac k {\lfloor\frac k t\rfloor+1}\rfloor\) 小于\(t\),这样由 \(\lfloor\dfrac k i\rfloor\) 单调不升且存在 \(\lfloor\dfrac k i\rfloor=t\) 就可以得证 \(r=\lfloor\dfrac k t\rfloor\) 时是最大的满足条件的右端点。
\(\lfloor\dfrac k {\lfloor\frac k t\rfloor+1}\rfloor\leq\dfrac k {\lfloor\frac k t\rfloor+1}\)
只需证 \(\dfrac k {\lfloor\frac k t\rfloor+1}<t\)
把分母乘过去,\(k<t*{\lfloor\frac k t\rfloor+t}\)
设 \(k=x*t+r,0\leq r<t\)
则 \(x*t+r<t*x+t\)
有\(r<t\)
得证。
好像可以拓展到二维,但我还没看,先咕了