码迷,mamicode.com
首页 > 其他好文 > 详细

整除分块小记

时间:2020-06-25 13:55:48      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:解决   结果   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!