数论分块
数论分块可以快速计算一些形如
i=1∑nf(i)g(⌊in⌋)
的和式。如果可以在 O(1) 时间内计算出 ∑i=lrf(i) 或者已经预处理出 f 的前缀和时,就可以用数论分块在 O(n) 时间内计算出上述和式的值。
思路
首先,若计算和式:
i=1∑11⌊i11⌋
首先观察到,对于不同的 i,⌊i11⌋ 的值有部分相同,呈现出“块状”结构。
| i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
| ⌊i11⌋ |
11 |
5 |
3 |
2 |
2 |
1 |
1 |
1 |
1 |
1 |
1 |
假如说我们知道这些块的取值以及宽度,我们就能直接计算每个块的和,快速完成统计。这就是整除分块的基本思路。
性质
下面考虑和式:
i=1∑n⌊in⌋
我们需要将 1∼n 之间的整数按照 ⌊in⌋ 的取值分成若干块,设
Dn={⌊in⌋:1≤i≤n,i∈N+}.
这就是⌊in⌋ 所有可能的取值集合。
接下来证明两个性质:
- ∣Dn∣≤2n
证明:
分两种情况讨论:
- 当 i≤n 时,i 的取值至多 n 个,所以 ⌊in⌋ 的取值也至多 n 个
- 当 i>n 时,⌊in⌋≤in<n 也至多只有 n 个取值
- 对于 d∈Dn,所有满足 ⌊in⌋=d 的整数 i 的取值范围为
⌊d+1n+1⌋≤i≤⌊dn⌋
证明:
⌊in⌋=d 相当于不等式
d≤in<d+1
这进一步等价于
d+1n<i≤dn
利用 i∈N+ 这一点,可以对不等式两边取整,等价于
⌊d+1n⌋+1≤i≤⌊dn⌋
这一性质体现了图像的对称性:每个块的右端点的集合恰为 Dn。
过程
为计算和式:
i=1∑nf(i)g(⌊in⌋)
可以根据 ⌊in⌋ 的取值将标号 i=1,2,⋯,n 分块,因为 ⌊in⌋ 取值相同的标号是一段连续整数 [l,r],所以该块中和式的取值为
(i=l∑rf(i))⋅g(⌊ln⌋)
左侧关于 f 的和式我们通常可以预处理出它的前缀和,从而在 O(1) 时间内完成单次查询。
在顺次计算每块的左右端点时,当前块的左端点 l 就等于前一块的右端点再加1,而当前块的右端点等于 ⌊⌊n/l⌋n⌋,因此,可以顺次计算每个块的值。整个过程的时间复杂度为 O(n)。
扩展
向上取整的数论分块
对于向上取整的和式:
i=1∑nf(i)g(⌈in⌉)
可以使用向上取整和向下取整的等式来转化成向下取整的情形:
⌈in⌉=⌊in+i−1⌋=⌊in−1⌋+1
i=1∑nf(i)g(⌈in⌉)=i=1∑n−1f(i)g(⌊in−1⌋+1)+f(n)g(1)
改变求和上限是为了让变形后的式子满足数论分块的形式。