数论分块可以快速计算一些形如

的和式.如果可以在 时间内计算出 或已经预处理出 的前缀和时,数论分块就可以在 时间内计算出上述和式的值.

数论分块常与 莫比乌斯反演 等技巧结合使用.

思路

首先,本文通过一个简单的例子来说明数论分块的思路.假设要计算如图所示的双曲线下的整点个数:

这相当于在计算和式:

这是前文所示和式在 时的特殊情况.

最简单的做法当然是逐列计算然后求和,但是这样需要计算第 列中每列整点的个数.观察图示可以发现,这些整点列的可以分成 块,每块内点列的高度是一致的,形成一个矩形点阵.所以,只要能够知道这些块的宽度,就能够通过计算这些矩形块的大小快速完成统计.

这就是整除分块的基本思路.

性质

本节讨论关于双曲线 下整点分块的若干结论.具体地,需要将 之间的整数按照 的取值分为若干块.设

这就是 所有可能的取值集合.

首先,这样的不同取值只有 个.所以,数论分块得到的块的数目只有 个.

性质 1

通过更细致的分析,实际上可以精确地描述集合 及其大小.

性质 2

.集合 中的元素从小到大依次是

进而,

然后,单个块的左右端点都很容易确定.

性质 3

对于 ,所有满足 的整数 的取值范围为

这一性质还体现了图像的对称性:每个块的右端点(前文图中的绿点)的集合恰为 .这很容易理解,因为整个图像关于直线 是对称的.

除了这些性质外,集合 还具有良好的递归性质:

性质 4

对于 ,有

前文已经提到, 既是每块中 的取值集合,也是每块的右端点集合.这意味着,如果要递归地应用数论分块(即函数在 处的值依赖于它在 处的值),那么在整个计算过程中所涉及的取值集合和右端点集合,其实都是 .一个典型的例子是 杜教筛

过程

利用上一节叙述的结论,就得到数论分块的具体过程.

为计算和式

的取值,可以依据 的取值将标号 分块.因为 取值相同的标号是一段连续整数 ,所以该块中和式的取值为

为了快速计算该和式,通常需要能够快速计算左侧关于 的和式.有些时候,该和式的表达式是已知的,可以在 时间内完成单次计算;有些时候,可以预处理出它的前缀和,仍然可以在 时间内完成单次查询.

在顺次计算每块左右端点时,当前块的左端点 就等于前一块的右端点再加 ,而当前块的右端点就等于 .由此,可以得到如下伪代码:

假设单次计算 的时间复杂度为 ,则整个过程的时间复杂度为

扩展

前文讨论的是数论分块的最常见也最基本的形式.本节进一步讨论数论分块的扩展形式.

向上取整的数论分块

数论分块可以用于计算含有向上取整的和式:

因为 ,该和式可以转化为向下取整的情形:

注意到求和的上限发生了变化,以及 时单独的一项.

多维数论分块

数论分块还可以用于处理包含不只有一个取整式的和式:

为了应用数论分块的思想,需要保证每块中所有取整式 的取值都不发生变化,也就是说,多维的块应当是所有一维的块的交集.为此,对于已知的左端点 ,相应的右端点为

也就是说,对于所有一维分块的右端点取最小值,作为多维分块的右端点.可以借助下图理解:

较为常见的是二维形式,此时可将前述伪代码中 替换成

任意指数数论分块

数论分块可以用于含有任意指数的取整式的和式计算:

其中, 为正实数.本文讨论的基本形式中,

性质

对于正整数 和正实数 ,设

那么,有

  1. 对于 ,使得 成立的 的取值范围为

利用这些性质,就可以在 的时间复杂度下实现对任意指数的数论分块.

例子

例如,对于 时的如下和式

可以通过数论分块在 时间内解决.已知块的左端点为 时,可以计算右端点为

例题

组数据,每组一个整数 .对于每组数据,输出

有一排 只怪兽,每只怪兽初始血量为 .一次攻击会使一段连续的存活的怪兽血量减 ,血量不大于 视作死亡.对于所有 求出击杀所有怪兽所需攻击次数.其中,

习题

参考资料与注释