标签:解决 结果 floor limits class 暴力 相同 分块 直接
一个在反演里面经常用到的小技巧。
整除分块是用来解决一个整除的求和问题: \(\sum\limits_{i=1}^{n} \lfloor \frac{n}{i} \rfloor\)
如果直接暴力算,\(O(n)\) 的时间复杂度肯定接受不了。
但是观察得到,对于一些 \(i\),\(\lfloor\frac n i \rfloor\)的值是相同的。
例如 \(n=10\) 时:(为了方便表示,下面的 /
都表示向下取整的除法)
\(10/1 = 10\)
\(10/2 = 5\)
\(10/3 = 3\)
\(10/4 = 10/5 = 2\)
\(10/6 = 10/7 = 10/8 = 10/9 = 10/10=1\)
不妨把结果相同的 \(i\),都归为一个块,那么总块数不会超过 \(2\sqrt n\) 个。
证明:
当 \(i<=\sqrt n\) 时,有 \(\sqrt n\) 种不同的块;
当 \(i>\sqrt n\) 时,\(\lfloor\frac n i \rfloor < \sqrt n\),也有 \(\sqrt n\) 种不同的块。
证毕。
如果知道一个块的左端点是 \(l\),那么这个块的右端点是 \(n/(n/l)\)。
证明略
然后就可以在 \(O(\sqrt n)\) 的时间内解决类似上面这样的问题了。
标签:解决 结果 floor limits class 暴力 相同 分块 直接
原文地址:https://www.cnblogs.com/smsylby/p/13191530.html