问题:求
怎么办呢?
暴力?
肯定会 TLE。
这个时候就要请出我们的整除分块了,时间复杂度为
很明显,在 C++ 语言中,除法都是向下取整的,所以在一段整数区间内,除以同一个数得出来的结果将会成一段一段表示。
这里有两个定理:
-
最多只有 种取值。 证明:对于
,很明显, 只有 种选择,对于 , ,也只有 种选择,所以总共也就 种取值。 -
设
与 相等,则 的最大值为 证明:
设
,于是可以写成 的形式,若 ,于是有 ,可以得到 ,则 能取的最大值为 ,于是: 然后,设两个指针
和 , 的初始值为 ,每次令 ,将 累加至答案中 ,再令 ,问题解决。