数论分块,也叫做整除分块,将结果相同的东西一起计算。
#1
题面
求 ∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n}\left\lfloor\frac{n}{i}\right\rfloor ∑i=1n⌊in⌋。
解法
这里就需要用到数论分块了。
容易发现,有很多 i i i 不同的 ⌊ n i ⌋ \left\lfloor\frac{n}{i}\right\rfloor ⌊in⌋ 结果是相同的,而且这些相同结果的 i i i 是相邻的。
比如说 ⌊ 13 5 ⌋ \left\lfloor\frac{13}{5}\right\rfloor ⌊513⌋ 和 ⌊ 13 6 ⌋ \left\lfloor\frac{13}{6}\right\rfloor ⌊613⌋。
于是,我们就可以把相同结果的一起计算,减少了很多时间。
当 n = 11 n=11 n=11 时,让 f i = ⌊ n i ⌋ f_i =\left\lfloor\frac{n}{i}\right\rfloor fi=⌊in⌋, f f f 数组是这样的
[ 0 , 11 , 5 , 3 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , . . . ] [0,11,5,3,2,2,1,1,1,1,1,1,0,...] [0,11,5,3,2,2,1,1,1,1,1,1,0,...]
f
1
f_1
f1 到
f
1
f_1
f1 为
11
11
11
f
2
f_2
f2 到
f
2
f_2
f2 为
5
5
5
f
3
f_3
f3 到
f
3
f_3
f3 为
3
3
3
f
4
f_4
f4 到
f
5
f_5
f5 为
2
2
2
f
6
f_6
f6 到
f
1
1
f_11
f11 为
1
1
1
通过猜测,我们发现了一个规律,一个相同结果的区间的左端点为
l
l
l,右端点
r
r
r 就是
⌊
n
⌊
n
l
⌋
⌋
\left\lfloor\frac{n}{\left\lfloor\frac{n}{l}\right\rfloor}\right\rfloor
⌊⌊ln⌋n⌋。
所以,我们只需要让 l l l 从 1 1 1 开始枚举,答案每次加上 ( r − l + 1 ) × ⌊ n l ⌋ (r - l + 1)\times\left\lfloor\frac{n}{l}\right\rfloor (r−l+1)×⌊ln⌋,然后让 l l l 变成 r + 1 r + 1 r+1,就可以快速计算出结果了。
#2
题面
求 ∑ i = 1 n n % i \sum_{i=1}^{n} n~\%~i ∑i=1nn % i。
解法
众所周知, a % b = a − ⌊ a b ⌋ × b a \% b = a - \left\lfloor\frac{a}{b}\right\rfloor\times b a%b=a−⌊ba⌋×b
∴ ∑ i = 1 n n % i = ∑ i = 1 n ( n − i × ⌊ n i ⌋ ) = n 2 − ∑ i = 1 n ( i × ⌊ n i ⌋ ) \begin{aligned} \therefore \sum_{i=1}^{n} n~\%~i =& \sum_{i=1}^{n} \Big(n-i \times \left\lfloor\frac{n}{i}\right\rfloor\Big)\\ =& n^2 - \sum_{i=1}^{n} \Big(i \times \left\lfloor\frac{n}{i}\right\rfloor\Big) \end{aligned} ∴i=1∑nn % i==i=1∑n(n−i×⌊in⌋)n2−i=1∑n(i×⌊in⌋)
这时候,直接计算 n 2 n^2 n2 ,数论分块解决 ∑ i = 1 n ( i × ⌊ n i ⌋ ) \sum_{i=1}^{n} \Big(i \times \left\lfloor\frac{n}{i}\right\rfloor\Big) ∑i=1n(i×⌊in⌋)。
我们考虑 ⌊ n i ⌋ \left\lfloor\frac{n}{i}\right\rfloor ⌊in⌋,则右端点为 ⌊ n ⌊ n l ⌋ ⌋ \left\lfloor\frac{n}{\left\lfloor\frac{n}{l}\right\rfloor}\right\rfloor ⌊⌊ln⌋n⌋。
尝试计算 ∑ i = l r ( i × ⌊ n i ⌋ ) \sum_{i=l}^{r} \Big(i \times \left\lfloor\frac{n}{i}\right\rfloor\Big) ∑i=lr(i×⌊in⌋)
∑ i = l r ( i × ⌊ n i ⌋ ) = ⌊ n i ⌋ × ∑ i = l r i = ⌊ n i ⌋ × ( r − l + 1 ) ( r + l ) 2 \begin{aligned} \sum_{i=l}^{r} \Big(i \times \left\lfloor\frac{n}{i}\right\rfloor\Big)=& \left\lfloor\frac{n}{i}\right\rfloor \times \sum_{i=l}^{r}i\\ =& \left\lfloor\frac{n}{i}\right\rfloor \times \frac{(r - l + 1)(r + l)}{2} \end{aligned} i=l∑r(i×⌊in⌋)==⌊in⌋×i=l∑ri⌊in⌋×2(r−l+1)(r+l)
最终,和 #1 一样,答案每次加上 ⌊ n i ⌋ × ( r − l + 1 ) ( r + l ) 2 \left\lfloor\frac{n}{i}\right\rfloor \times \frac{(r - l + 1)(r + l)}{2} ⌊in⌋×2(r−l+1)(r+l) 即可。