数论分块

前言


 

这几天在学莫比乌斯反演的时候看到了关于数论分块的内容,写篇博客来记录一下相关的内容

 

整除分块


 

整除分块是用来计算形如 $\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;
    //进行计算
}
View Code

 

 

例题


 

BZOJ 1257:[CQOI2007]余数之和

给定 $n, k$ 计算 $$ \sum_{i = 1}^{n} k \; mod \; i$$

将式子进行变形可得 $$\sum_{i = 1}^{n} k \; - \; \lfloor \frac{k}{i} \rfloor \; * \; i$$

 

posted @ 2020-02-06 10:27  ZSsst  阅读(177)  评论(0编辑  收藏  举报