算法学习笔记(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)\)

posted @ 2024-06-06 20:55  qqrj  阅读(54)  评论(0)    收藏  举报