数论分块/整除分块
数论分块可用于求解\(\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

浙公网安备 33010602011771号