整除分块(数论分块)

转自大佬
一个有♂趣的问题:

∑ i = 1 N ⌊ N i ⌋ , N ≤ 1 0 12 \sum_{i=1}^N⌊\frac{N}i⌋ ,N≤10^{12} i=1NiNN1012

显然不能直接做废话

经过一番冷静推理暴力打表 ,我们发现以下性质:

1. ⌊ N i ⌋ ⌊Ni⌋ Ni最多只有 2 N 2\sqrt{N} 2N 种取值

证明:对于 i ≤ N i≤\sqrt{N} iN , 只有 N \sqrt{N} N 种,对于 i> N \sqrt{N} N , N i \frac{N}i iN< N \sqrt{N} N ,也只有 N \sqrt{N} N 种取值,共计 2 N \sqrt{N} N 种□

  1. ⌊ N i ′ ⌋ ⌊\frac{N}{i^′}⌋ iN ⌊ N i ⌋ ⌊\frac{N}i⌋ iN 相等,则 i′ 的最大值为 ⌊ N ⌊ N i ⌋ ⌋ ⌊\frac{N}{⌊Ni⌋}⌋ NiN
    证明:

⌊ N i ⌋ ⌊\frac{N}i⌋ iN=k ,于是可以写成 k i + p = N , 1 ≤ p < i ki+p=N,1≤p<i ki+p=N,1p<i的形式,若 ⌊ N i + d ⌋ = k ⌊\frac{N}{i+d}⌋=k i+dN=k ,于是有 k ( i + d ) + p ′ = N k(i+d)+p′=N k(i+d)+p=N ,可以得到 p ′ = p − k d p′=p−kd p=pkd,则 d 能取的最大值为 ⌊ p k ⌋ ⌊\frac{p}k⌋ kp ,于是 :

i ′ = i + d m a x = i + ⌊ p k ⌋ = i + ⌊ N    m o d    i ⌊ N i ⌋ ⌋ = i + ⌊ N − ⌊ N i ⌋ i ⌊ N i ⌋ ⌋ = ⌊ i + N − ⌊ N i ⌋ i ⌊ N i ⌋ ⌋ = ⌊ ⌊ N i ⌋ i ⌊ N i ⌋ + N − ⌊ N i ⌋ i ⌊ N i ⌋ ⌋ = ⌊ N ⌊ N i ⌋ ⌋ □ \begin{aligned}i'&=i+d_{max} \\ &=i+\lfloor \frac pk \rfloor \\&=i+\left \lfloor \frac {N \;mod\; i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=i+\left \lfloor \frac {N-\lfloor \frac Ni\rfloor i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=\left \lfloor i + \frac {N-\lfloor \frac Ni\rfloor i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=\left \lfloor \frac{\lfloor \frac Ni \rfloor i}{\lfloor \frac Ni \rfloor} + \frac {N-\lfloor \frac Ni\rfloor i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=\left \lfloor \frac N{\lfloor \frac Ni \rfloor} \right \rfloor \quad \quad\Box\end{aligned} i=i+dmax=i+kp=i+iNNmodi=i+iNNiNi=i+iNNiNi=iNiNi+iNNiNi=iNN

然后,设两个指针 L 和 R , L 的初始值为 1 ,每次令 R = ⌊ N ⌊ N L ⌋ ⌋ R=⌊\frac{N}{⌊\frac{N}L⌋}⌋ R=LNN ,将 ( R − L + 1 ) ⋅ ⌊ N L ⌋ (R−L+1)⋅⌊\frac{N}L⌋ (RL+1)LN 累加至答案中 ,再令 L = R + 1 L=R+1 L=R+1

由于 ⌊ N L ⌋ ⌊\frac{N}L⌋ LN只有 2 N 2\sqrt{N} 2N 种取值 ,且单调递减,则最多只有 2 N 2\sqrt{N} 2N 个取值不同的段,时间复杂度为 O ( N ) O(\sqrt{N}) O(N ) 终于可以水过去了

你可能感兴趣的:(算法详解)