P2261 [CQOI2007]余数求和
\(\text{solution}\)
基础数学题。
这个东西虽然很基础,但是很重要!
我们发现这个东西不就是 \(O(n)\) 的吗?直接开码,发现 $ n \le 10^9$,这 tm 怎么过去啊。
其实这是一个经典问题,首先推一下柿子:
\[\sum_{i = 1}^{n} k \bmod i
\]
这里有一个生活中的小常识:\(a \bmod b = a - b \times \left\lfloor \frac{a}{b} \right\rfloor\),所以:
\[\sum_{i = 1}^{n} k - k \times \left\lfloor \frac{k}{i} \right\rfloor
\]
这个时候用到一个常用的优化:整除分块,我们发现只要将 \(\left\lfloor \frac{k}{i} \right\rfloor\) 求出即可。
我们发现 \(\left\lfloor \frac{k}{i} \right\rfloor\) 的值在 \(i\) 等于某些值是相等的,且这些 \(i\) 都是连续的。也就是说我们可以分成很多个块。
我们先来证明一下块数为 \(\sqrt{n}\),这个很简单,因为 \(\left\lfloor \frac{n}{i} \right\rfloor < \sqrt{n}\) 的,而最大的值又为 \(\left\lfloor \frac{n}{i} \right\rfloor\),所以并不超过。
考虑求出连续一段的 \([l, r]\),我们发现第一段的 \(l = 1\),所以我们只需求出 \(r\) 即可,为 \(\left\lfloor \frac{n}{\left\lfloor \frac{n}{i} \right\rfloor} \right\rfloor\) 就 OK 了。
然后分段去算就 OK 了。

浙公网安备 33010602011771号