整除分块学习笔记
模型
求 \(\large\sum^{n}_ {i=1} \lfloor{\frac{n}{i}}\rfloor\)
假设 \(n\) 等于 10,我们可以列出下表:
\(\ i\) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
\(\frac{10}{i}\) | 10 | 5 | 3 | 2 | 2 | 1 | 1 | 1 | 1 | 1 |
如果我们的 \(n\) 更大时,我们可以发现 \(\frac{10}{i}\) 中有许多重复的地方。
我们可以将相同的分为一块,这样可以发现块不会超过 \(2\sqrt n\) 个。
证明:
我们设当前块的值为 \(m\):
当 \(m\le \sqrt n\) 时,\(\frac nm\) 总共的个数,不会超过 \(m\) 的个数,因此最多有 \(\sqrt n\) 个块。
当 \(m> \sqrt n\) 时,\(\frac nm\) 的取值应该在 \([1,\sqrt n]\) 之间,因此也最多有 \(\sqrt n\) 个块。
综上,块的个数不超过 \(2\sqrt n\)。
推导
我们需要找到每个块的左右端点,设我们已知这个块的左端点 \(l\),则考虑怎么找到右端点 \(r\)。
设这个块的值为 \(x\),那么对于块中的每个数 \(i\),则有 \(x=\lfloor{\frac{n}{l}}\rfloor=\lfloor{\frac{n}{i}}\rfloor\)。
那么 \(r=max(i)\),因为 \(i\times x\le n\),我们可以设 \(i\times x=n\) 以此来找到最大的 \(r\)。
则 \(\large r=\lfloor{\frac{n}{x}}\rfloor=\bigl\lfloor{\frac{n}{\lfloor{n/l}\rfloor}}\bigl\rfloor\)。
下一个块的 \(l'\) 就应该是 \(r+1\)。
变形
\(\mathfrak{first.}\)
\(\large\sum^{min(n,m)}_ {i=1} \lfloor{\frac{n}{i}}\rfloor\lfloor{\frac{m}{i}}\rfloor\)
设 \(x1=\lfloor{\frac{n}{i}}\rfloor,x2=\lfloor{\frac{m}{i}}\rfloor\)。
则有 \(i\times x1\le n,i\times x2\le m\)。
则 \(r=\max(i)\),所以 \(r=\min(\bigl\lfloor{\frac{n}{\lfloor{n/l}\rfloor}}\bigl\rfloor,\bigl\lfloor{\frac{m}{\lfloor{m/l}\rfloor}}\bigl\rfloor)\)。
\(\mathfrak{second.}\)
已知 \(f(i)\) 为 \(i\) 的约数个数,求 \(\sum_{i=1}^n f(i)\)。
题目来源:P1403 [AHOI2005] 约数研究
我们直接计算每个数的约数个数显然会超时,那么我们不妨枚举每个约数的个数。
显然的 \(i\) 在 \(n\) 中的贡献即是:\(\lfloor{\frac n i}\rfloor\),
那么问题就转换为了:求 \(\large\sum^{n}_ {i=1} \lfloor{\frac{n}{i}}\rfloor\)。
整除分块即可。
\(\mathfrak{trird.}\)
已知 \(a,b,n\),求 \(\large\sum^{n}_ {i=1} \lfloor{\frac{n}{ai+b}}\rfloor\)
考虑换元,设 \(g=ai+b\)。
还是一样的,则对 \(\lfloor{\frac{n}{g}}\rfloor\) 做整除分块。
设 \(x=\lfloor{\frac{n}{g}}\rfloor\),则有 \(i\times g\le n\)。
则 \(r'=\max(i)\),所以 \(r'=\bigl\lfloor{\frac{n}{x}}\bigl\rfloor=\biggl\lfloor{\frac{n}{\lfloor{\frac{n}{g}}\rfloor}}\biggl\rfloor=\large\biggl\lfloor{\frac{n}{\lfloor{\frac{n}{al+b}}\rfloor}}\biggl\rfloor\)。
对于 \(g=ai+b,r'=\max(g)\),
则可以推出 \(i=\frac{g-b}{a},r=\max(i)=\max(\frac{g-b}{a})=\max(\frac{r'-b}{a})\)。
所以 \(r=\huge\large\Biggl\lfloor{\dfrac{\biggl\lfloor{\dfrac{n}{\lfloor{\frac{n}{al+b}}\rfloor}}\biggl\rfloor-b}{a}}\large\Bigg\rfloor\)。