数论分块
前言
这几天在学莫比乌斯反演的时候看到了关于数论分块的内容,写篇博客来记录一下相关的内容
整除分块
整除分块是用来计算形如 $\sum_{i=1}^{n} \lfloor \frac{n}{i} \rfloor$ 的式子的一种方法,当数据范围偏大时,显然 $O(n)$ 的算法会超时,那么就要用到整除分块的方法来进行计算。
首先我们可以打表观察一下,$\lfloor \frac{n}{i} \rfloor$ 的值在一段连续的区间内是相同的,也就是说 $\lfloor \frac{n}{i} \rfloor$ 的值呈块状分布。
并且我们可以得出,当 $i \leq \sqrt{n}$ 时,$\lfloor \frac{n}{i} \rfloor$ 最多有 $\sqrt{n}$ 种可能,同理可得当 $i>\sqrt{n}$ 时,最多也只有 $\sqrt{n}$ 种可能,所以我们可以在 $O(\sqrt{n})$ 的复杂度内计算出该式子的值。
接下来便是寻找每一个 $\lfloor \frac{n}{i} \rfloor$ 值所对应的连续区间,我们假设区间左端点为 $l$ ,那么区间的右端点便为 $\lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor$。
证明:
我们假设 $\lfloor \frac{n}{l} \rfloor = T$
则有 $n = l * T + x$ ,其中 $0 \leq x < l$
下面寻找区间右端点,我们可以假设 $\lfloor \frac{n}{l + d} \rfloor = T$
可得 $n = (l + d) * T + x'$,其中 $0 \leq x' < l + d$
将两等式相减可得 $d = \frac{x - x'}{T}$
因为我们要寻找区间右端点,所以我们需要 $d_{max}$
由上式可得出 $d_{max} = \lfloor \frac{x}{T} \rfloor$
则区间右端点 $r = l + d_{max} = l + \lfloor \frac{x}{T} \rfloor = \lfloor \frac{l * T + x}{T} \rfloor = \lfloor \frac{l * T + n - l * T}{T} \rfloor = \lfloor \frac{n}{T} \rfloor = \lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor $
代码:
for(int l = 1, r = 0; l <= n; l = r + 1){ if ((n / l) != 0) r = min(n / (n / l), n); else r = n; //进行计算 }
例题
BZOJ 1257:[CQOI2007]余数之和
给定 $n, k$ 计算 $$ \sum_{i = 1}^{n} k \; mod \; i$$
将式子进行变形可得 $$\sum_{i = 1}^{n} k \; - \; \lfloor \frac{k}{i} \rfloor \; * \; i$$