数论分块

例如  n = 20

1   2   3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

20 10 6 5 4 3 2 2 2  2   1   1   1   1   1    1   1   1  1  1

一个明显的规律,使得某个区间(区间长度可能为1)有连续的 \frac{n}{i} 数值相同,

把左右的区间块确定,那问题可以得到优化。

结论

已知 区间的左端点是L ,那么它的右端点是  \frac{n}{n/L}

举例 : 建设 L = 7 时  , n/L = 20/7 = 2 , n/(n/L) = 20/2 = 10   符合区间 [ 7 , 10 ]; 

 

\sum_{i=1}^{n}[\frac{n}{i}]      求区间内的和

int sum = 0;
for(int l=1,r; l<=n ; l=r+1){
    r = n/(n/l);
    sum += (r-l+1) * (n/l);
}

时间复杂 (O\sqrt{n}

你可能感兴趣的:(数论,算法)