算法学习笔记(21):数论分块
数论分块
大部分内容来源于OI-WIKI
引理1: \(\\forall a,b,c\in\mathbb{Z},\left\lfloor\frac{a}{bc}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor}{c}\right\rfloor\)
引理2: \(\lfloor \frac{n}{i} \rfloor\) 的取值有 \(O(\sqrt n)\) 种
引理 1 可以把一些分母搬上去, 转化成引理 2 的形式。 考虑引理 2 的式子的性质, 这启发我们计算 \(\sum \frac{n}{i}\) 时
可以快速统计。
有一个结论: 取值为 \(\large\frac{n}{l}\) 的最大的 \(i\) 等于 \(\large\lfloor \frac{n}{\lfloor\frac{n}{l}\rfloor} \rfloor\)。
所以我们就可以这么算 \(\large\sum \frac{n}{i}\) :
int Sum(int x) {
int l = 1, r = 0, res = 0;
while(l <= x) {
r = x / (x / l);
res += (r - l + 1) * (x / l);
l = r + 1;
}
return res;
}
拓展的, 当我们需要计算 \(\large\sum f_i \times \frac{n}{i}\)时:
可以把 res += (r - l + 1) * (x / l); 替换成 res += (f[r] - f[l - 1]) * (x / l);。
再拓展地: 取值为 \(\large\frac{n}{l}\) 的最大的 \(i\) 为 \(\large\lfloor \frac{n - 1}{\lfloor\frac{n - 1}{l}\rfloor} \rfloor\)。
不严谨的证明:
引理4: \(\left\lceil\dfrac ni\right\rceil=\left\lfloor\dfrac{n-1}i\right\rfloor+1\)
证明: \(\left\lfloor\dfrac{n-1}i\right\rfloor+1 = \left\lfloor\dfrac{n-1 + i}i\right\rfloor\), 考虑 $\dfrac{i - 1}{i} < 1 $, 所以易得前面的式子成立。
所以 \(\large\left\lceil\dfrac ni\right\rceil\) 分的块和 \(\left\lfloor\dfrac{n-1}i\right\rfloor\) 分的块一致。
n维数论分块
我们考虑二维, 计算 \(\sum \lfloor \frac{a_1}{i} \rfloor + \lfloor \frac{a_2}{i} \rfloor\)。 我们要快速计算某一段 \((l, r)\) 的值, 也就是我们需要 \(\sum_{l = 1}^{r} \lfloor \frac{a_1}{i} \rfloor + \lfloor \frac{a_2}{i} \rfloor\), 中的 $\lfloor \frac{a_1}{i} \rfloor $ 都相同, \(\lfloor \frac{a_2}{i} \rfloor\) 都相同。
所以 \(r\) 端点取 \(min(\large\lfloor \frac{a_1}{\lfloor\frac{a_1}{l}\rfloor} \rfloor, \large\lfloor \frac{a_1}{\lfloor\frac{a_2}{l}\rfloor} \rfloor)\)。

浙公网安备 33010602011771号