整除分块小记

一个在反演里面经常用到的小技巧。

整除分块是用来解决一个整除的求和问题: \(\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)\) 的时间内解决类似上面这样的问题了。

猜你喜欢

转载自www.cnblogs.com/smsylby/p/13191530.html
今日推荐