『算法-ACM竞赛-数学-数论』整除分块(巨TM详细,学不会,你来打我)
『算法-ACM 竞赛-数学-数论』整除分块(巨 TM 详细,学不会,你来打我)
1.概念
从一道例题说起
$在介绍整除分块之前,我们先来看一道算数题:
已知正整数n,求∑i=1n⌊ni⌋\begin{aligned}已知正整数n,求\sum_{i=1}^n \left⌊\dfrac{n}{i}\right⌋\end{aligned}$
我们写一个表格看一看 1-20 的整除是什么样子的
| i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| —————————– | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
| $\left⌊\dfrac{20}{i} \right⌋$ | 20 | 10 | 6 | 5 | 4 | 3 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
表中同样的值会连续出现,而相同的值所划分的区间积是整出分块。整除的性质使得从 1 到 n 的数组表可根据数值划分为不同的分块,且分块数远远小于 n。利用这种性质,我们如果能推导出每个分块具体的左右端点位置在哪,这个问题就可以快速求解出来了。
2.整除分块公式推导
向下取整的情形
还是说我们的例题
$已知正整数n,求\sum_{i=1}^n \left⌊\dfrac{n}{i}\right⌋$
假设我们已知某一个分块的左端点 lll,要求解出该分块的右端点 rrr。设该分块的数值为 kkk,对于该分块中的每个数 iii,有$k=\left⌊\dfrac{n}{i}\right⌋=\left⌊\dfrac{n}{l}\right⌋$,即$ik\le n$,也就是说我们找到可得使$ik\le n$成立的最大的 i 的值即是我们所求的右端点 r,因此我们可以得到下列式子:
$\begin{cases}k = \left⌊\dfrac{n}{l}\right⌋ \\space \r = \max (i), ik \le n\end{cases}$
推导可得:
$r= \left⌊\dfrac{n}{k}\right⌋=\left⌊\dfrac{n}{\left⌊\dfrac{n}{l}\right⌋ }\right⌋$
容易得到代码:
1 |
|
But 还没有结束
我们再看这一道题:
$\begin{aligned}已知正整数n, a, b, 求\sum_{i=1}^n \left⌊\dfrac{n}{ai + b} \right⌋\end{aligned}$
抓瞎了,但是变变形应该可以做。
我们记得
$\begin{cases}k = \left⌊\dfrac{n}{l}\right⌋ \\space \r = \max (i), ik \le n\end{cases}$
$r= \left⌊\dfrac{n}{k}\right⌋=\left⌊\dfrac{n}{\left⌊\dfrac{n}{l}\right⌋ }\right⌋$
以上两个公式,我们有如下
$\begin{cases}k = \left⌊\dfrac{n}{al+b}\right⌋ \\space \r = \max (i), (ai+b)k \le n\end{cases}$
上式子可推导为
但是对于这个题目,我们给出第二种推导方式,使得一种推导方式解决多种题目。
这我们再做
$\begin{aligned}已知正整数n, 求\sum_{i=1}^n \left⌊\dfrac{n}{i^2} \right⌋\end{aligned}$
我们按照上面的方式推导
不知道这时候有多少人偷笑,说自己把整除分块学会了,曾经以为自己是个王者,结果他爸来。
这个题你懵了吗,对于一对 L 和 R,中间的值是等差数列,相差 1,归根结底还是整除分块,还是找到 l 和 r,通过等差数列计算即可。
代码如下:
1 |
|
王者你会了吗?
王者自信满满的说自己会了!
王者再看看这个题
$已知正整数n,求\sum_{i=1}^n \left⌈\dfrac{n}{i}\right⌉$
没 4 没 4,我们就不推导向上取整了,这里只需要一个小转化,将向上取整转化为向下取整。
我们考虑没有整除的时候是不是就有
$\left⌈\dfrac{n}{i}\right⌉ =\left⌊\dfrac{n}{i}\right⌋+1$ 如果整除的时候就相等了,那么我们只要不加 1,我们加上$\dfrac{i-1}{i}$就可以避免这种情况,那么就可以转化为
通过上面向下取整的推到即可得到
到这里王者就可以独当一面了。