数论分块/整除分块

数论分块可用于求解\(\sum_{i = 1} ^ n \lfloor \frac n i \rfloor\)

可以将\(\lfloor \frac n i \rfloor\)相同的值一起算,避免逐一枚举相加

时间复杂度为\(O(\sqrt n)\)

原理简述:对于每个\(\lfloor \frac n i \rfloor\)的可能取值\(num\),需要寻找最大区间\([l,r]\),使得该区间内的值\(k\in[l, r]\)均满足\(\lfloor \frac n k \rfloor=num\)

大概可以想象一个过程:\(i\)从1开始逐渐++

在某一刻,当\(i\)++后,\(\lfloor \frac n i \rfloor\)的值发生了改变,此处的改变显然为减1

那么此时\(i\)一定是越过了某个“边界”,由于\(i\)++,这个边界意味着\(i\)从当前区间\([l,r]\)\(r\)跳变为下一个相邻区间的\(l\)

\(i = \frac n {\frac n i} >= \frac n {\lfloor\frac n i\rfloor}\),而\(i = \frac n {\frac n i} < \frac n {\lfloor\frac n i\rfloor + 1}\)

故可以看出这个边界中的\(r\)就是\(\lfloor\frac n i\rfloor\)

因此按每个\([l, r]\)区间分块,不断令\(i =\lfloor\frac n i\rfloor\)就可以迅速遍历每一个块的右端点r,左端点亦可得出

可以证明块的数量不超过\(2\sqrt n\),时间复杂度\(O(\sqrt n)\)

证明过程可参考:OI-WIKI

相关题目:https://atcoder.jp/contests/abc414/tasks/abc414_e

posted @ 2025-07-14 11:11  LIGHTB  阅读(18)  评论(0)    收藏  举报