引子
整除分块比较经典的一个例题
求
,
上取整也是一样的
如果我们直接暴力求的话, 时间复杂度是
整除分块
我们知道, 在整除意义下
时间复杂度的证明
分两种情况
对于
, 假设每个i的结果都不一样, 最多也只有 种不同的结果对于
, 分布在 ,也就是最多只有 种
证毕, 整除分块的时间复杂度为
实现
既然我们已经证明了时间复杂度, 那接下来我们就想办法实现它
既然结果相同的i分布在连续的区间内, 那我们就通过两个端点l, r确定区间, 然后不断移动l, r就可以了
初始时, 设l = 1
- 计算出
- 确定r,
- 统计答案,
- 重复上述过程, 直到
关于第2步的证明
假设当前答案为
那么
所以
代码就不上了
Update
更新一下向上取整的情况, 感觉较向下取整还是复杂了些。
初始时, 设l = 1
- 计算出
- 确定r, 如果
, , 否则 - 统计答案,
- 重复上述过程, 直到
关于第二步的证明
假设当前答案为
转换成i的范围
把i转换成范围内的整数
即
所以i最大为