CF2076G 题解
CF2076G 题解
数论分块,根号分治
首先观察到当 \(n\) 在 \(p\) 进制下位数很多的时候,很难把 \(p\) 不同的情况放在一起处理,只能老老实实地把 \(n\) 展开成 \(p\) 进制的形式再计算。由于当 \(p^{2} < n\) 时 \(n\) 的 \(p\) 进制表示才多于 \(2\) 位,所以可以暴力处理 \(p < \sqrt{n}\) 时的情况,这样做的时间复杂度为 \(O(\sqrt{n})\) \(^{\ast}\)。
\(^{\ast}\):这里时间复杂度的上界容易分析到 \(O(\sqrt{n} \log n)\),但实际上更紧的界是 \(O(\sqrt{n})\),见 CF 的这个评论。
而 \(n\) 的 \(p\) 进制表示不超过 \(2\) 位时,我们考虑一起处理。
当 \(p > n\) 时,\(n\) 的 \(p\) 进制表示只有 \(1\) 位,翻转以后的值仍为 \(n\)。
当 \(n\) 的 \(p\) 进制表示只有 \(2\) 位时,\(n\) 可以被表示成 \(\lfloor n / p \rfloor p + (n \bmod p)\),于是 \(\operatorname{rev}(n, p) = (n \bmod p) + \lfloor n / p \rfloor\)
。考虑如何快速计算 \(\sum_{p = \lfloor \sqrt{n} \rfloor + 1}^{\min(n, k)} ((n \bmod p) + \lfloor n / p \rfloor)\)。
(为了方便,下面省略求和符号中 \(p\) 的上下界。)
对 \(\lfloor n / p \rfloor\) 求和,容易想到数论分块,但 \(n \bmod p\) 这一项不太好处理。把它改写成 \(n - \lfloor n / p \rfloor p\),这样就统一凑成了整除的形式,于是待求式子变成
第一个和式可以直接计算,剩下两个和式都可以通过数论分块在 \(O(\sqrt{n})\) 的时间内计算。