对于,我们一般计算的话复杂度是O(n),但只用整除分块的话可以用O(√n)的时间复杂度求出这个式子的值。
对于这个式子,我们可以知道有
其中 l 表示 n/i 的值相等的区间的左端点,相应的 r 表示右端点。
那么我们就能推出 (其实就是区间长度乘上区间单点的值),因此我们可以通过左端点 l 和 n 以O(1)的复杂度求出区间的总和
,因此,求出整体的和的复杂度只需要O(√n)。
//代码模板
for(int l = 1, r; l <= n; l = r + 1){
r = n/(n/l);
sum += (r - l + 1) * (n / l);
}