首页 > 其他 > 详细

整除分块小记

时间:2020-06-25 13:22:39      阅读:52      评论:0      收藏:0      [点我收藏+]

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

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

整除分块小记

原文:https://www.cnblogs.com/smsylby/p/13191530.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!