数论分块(整除分块)

数论分块,也叫做整除分块,将结果相同的东西一起计算。

#1

题面

∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n}\left\lfloor\frac{n}{i}\right\rfloor i=1nin

解法

这里就需要用到数论分块了。

容易发现,有很多 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 lnn

所以,我们只需要让 l l l 1 1 1 开始枚举,答案每次加上 ( r − l + 1 ) × ⌊ n l ⌋ (r - l + 1)\times\left\lfloor\frac{n}{l}\right\rfloor (rl+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=aba×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=1nn % i==i=1n(ni×in)n2i=1n(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 lnn

尝试计算 ∑ 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=lr(i×in)==in×i=lriin×2(rl+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(rl+1)(r+l) 即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值