• 数论分块


    本质就是利用取整分数值的块状分布。

    UVA11526 H(n)

    题意: ∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n} \lfloor\frac {n}{i}\rfloor i=1nin

    解析:

    ⌊ n i ⌋ \lfloor \frac{n}{i} \rfloor in 只有 O ( n ) O(\sqrt n) O(n ) 种取值,考虑将相同值同时处理。时间复杂度 O ( T n ) O(T\sqrt n) O(Tn )

    对于 i i i,其块右端点 j j j 满足: j = ⌊ n ⌊ n i ⌋ ⌋ j = \lfloor \dfrac{n}{\lfloor \frac{n}{i} \rfloor} \rfloor j=inn

    证明:对所有 ⌊ n i ⌋ = k \lfloor \frac{n}{i} \rfloor=k in=k i i i:由 k ≤ n i k \le \frac{n}{i} kin,有 ⌊ n k ⌋ ≥ ⌊ n n i ⌋ = ⌊ i ⌋ = i \lfloor\frac{n}{k}\rfloor \ge \lfloor {\frac{n}{\frac n i}} \rfloor= \lfloor i \rfloor = i kninn=i=i

    ⌊ n k ⌋ \lfloor\frac{n}{k}\rfloor kn ⌊ n ⌊ n i ⌋ ⌋ \lfloor \frac{n}{\lfloor \frac{n}{i} \rfloor} \rfloor inn 即为该块所在右端点。

    代码

    [AHOI2005] 约数研究

    考虑约数 i i i 1 ∼ n 1 \sim n 1n 中出现次数,即 i i i 的倍数个数,为 n i \frac{n}{i} in。答案即为 ∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n} \lfloor{\frac{n}{i}}\rfloor i=1nin

    代码

    约数和

    同样考虑约数的贡献,即求 ∑ i = 1 n i × ⌊ n i ⌋ \sum_{i=1}^{n} i \times \lfloor\frac{n}{i}\rfloor i=1ni×in

    考虑到原式子 < ∑ i = 1 n n < \sum_{i=1}^n n <i=1nnlong long 即可。

    代码

    [CQOI2007] 余数求和

    ∑ i = 1 n k   m o d   i = ∑ i = 1 n ( k − ⌊ k i ⌋ i ) = n k − ∑ i = 1 n ⌊ k i ⌋ i \sum_{i=1}^n k \bmod i \\ =\sum_{i=1}^n (k - \lfloor{\frac{k}{i}}\rfloor i) \\ =nk-\sum_{i=1}^n \lfloor{\frac{k}{i}}\rfloor i i=1nkmodi=i=1n(kiki)=nki=1niki

    CF1485C Floor and Mod

    妙。

    法一

    ⌊ a b ⌋ = a   m o d   b \lfloor \frac{a}{b} \rfloor = a\bmod b ba=amodb

    ⌊ a b ⌋ = a − ⌊ a b ⌋ b \lfloor \frac{a}{b} \rfloor = a - \lfloor \frac{a}{b} \rfloor b ba=abab

    ⌊ a b ⌋ = a b + 1 \lfloor \frac{a}{b} \rfloor = \frac{a}{b+1} ba=b+1a

    b + 1 ∣ a b+1 \mid a b+1a

    a b + 1 = a   m o d   b < b \frac{a}{b+1} = a \bmod b< b b+1a=amodb<b,得 a < b 2 + b a < b^2+b a<b2+b

    b + 1 ∣ a b+1 \mid a b+1a,由 a < b 2 + b a < b^2+b a<b2+b,得 b ∤ a b \nmid a ba,故 ⌊ a b ⌋ = a b + 1 \lfloor \frac{a}{b} \rfloor = \frac{a}{b+1} ba=b+1a

    综上, b + 1 ∣ a b+1 \mid a b+1a a < b 2 + b a < b^2 + b a<b2+b 是原命题的一个充要条件。

    答案即为
    ∑ b = 1 y min ⁡ ( x , b 2 + b − 1 ) b + 1 \sum_{b=1}^{y} \dfrac{\min(x,b^2+b-1)}{b+1} b=1yb+1min(x,b2+b1)

    分段整除分块即可。

    总结:根据整除关系、范围得到一些性质,从而找出充要条件。

    代码

    法二(官方做法)

    ⌊ a b ⌋ = a   m o d   b = k \lfloor \frac{a}{b} \rfloor = a\bmod b = k ba=amodb=k

    a = k b + k a = kb + k a=kb+k

    b + 1 = a k b+1=\frac{a}{k} b+1=ka

    k < b k < b k<b,得 k + 1 < a k k+1<\frac a k k+1<ka,故 k k k 为根号级别。

    枚举 k k k,考虑 b b b 的数量。可得 b ≤ x k − 1 b \le \frac x k - 1 bkx1,且 k < b ≤ y k < b \le y k<by

    总结:观察 + 放缩 k k k 的范围。

    代码

    [清华集训2012] 模积和

    推式子:

    式子是比较容易推的。

    ∑ i = 1 n ∑ j = 1 m ( n   m o d   i ) × ( m   m o d   j ) , i ≠ j \sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq j i=1nj=1m(nmodi)×(mmodj),i=j

    ∑ i = 1 n ∑ j = 1 m ( n − ⌊ n i ⌋ i ) × ( m − ⌊ m j ⌋ j ) (1) \sum_{i=1}^{n} \sum_{j=1}^{m} (n - \lfloor \frac n i \rfloor i) \times (m - \lfloor \frac m j \rfloor j) \tag 1 i=1nj=1m(nini)×(mjmj)(1)
    ∑ i = 1 min ⁡ ( n , m ) ( n − ⌊ n i ⌋ i ) × ( m − ⌊ m i ⌋ j ) (2) \sum_{i=1}^{\min(n,m)}(n - \lfloor \frac n i \rfloor i) \times (m - \lfloor \frac m i \rfloor j) \tag 2 i=1min(n,m)(nini)×(mimj)(2)

    答案为 ( 1 ) − ( 2 ) (1) - (2) (1)(2)

    ( 1 ) : (1): (1):

    ∑ i = 1 n ∑ j = 1 m ( n − ⌊ n i ⌋ i ) × ( m − ⌊ m j ⌋ j ) \sum_{i=1}^{n} \sum_{j=1}^{m} (n - \lfloor \frac n i \rfloor i) \times (m - \lfloor \frac m j \rfloor j) i=1nj=1m(nini)×(mjmj)

    = ∑ i = 1 n ( ( n − ⌊ n i ⌋ i ) ∑ j = 1 m ( m − ⌊ m j ⌋ j ) ) =\sum_{i=1}^{n} \left((n - \lfloor \frac n i \rfloor i) \sum_{j=1}^{m} (m - \lfloor \frac m j \rfloor j)\right) =i=1n((nini)j=1m(mjmj))

    = ∑ i = 1 n ( n − ⌊ n i ⌋ i ) × ∑ j = 1 m ( m − ⌊ m j ⌋ j ) =\sum_{i=1}^{n} (n - \lfloor \frac n i \rfloor i) \times \sum_{j=1}^{m} (m - \lfloor \frac m j \rfloor j) =i=1n(nini)×j=1m(mjmj)

    显然可以分别拿出来数论分块,时间复杂度 O ( n ) O(\sqrt n) O(n )

    ( 2 ) : (2): (2):

    ∑ i = 1 min ⁡ ( n , m ) ( n − ⌊ n i ⌋ i ) × ( m − ⌊ m i ⌋ i ) \sum_{i=1}^{\min(n,m)}(n - \lfloor \frac n i \rfloor i) \times (m - \lfloor \frac m i \rfloor i) i=1min(n,m)(nini)×(mimi)

    = ∑ i = 1 min ⁡ ( n , m ) ( n m − m ⌊ n i ⌋ i − n ⌊ m i ⌋ i + ⌊ n i ⌋ ⌊ m i ⌋ i 2 ) =\sum_{i=1}^{\min(n,m)}(nm - m\lfloor \frac n i \rfloor i- n\lfloor \frac m i \rfloor i + \lfloor \frac n i \rfloor\lfloor \frac m i \rfloor i^2) =i=1min(n,m)(nmmininimi+inimi2)

    对于前三项的计算是比较容易的,考虑第四项:

    无非整除分块的块多了一点,考虑块内两者值均相等,此时 i i i 所在块右端点为 min ⁡ ( ⌊ n ⌊ n i ⌋ ⌋ , ⌊ m ⌊ m i ⌋ ⌋ ) \min(\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor, \lfloor\frac{m}{\lfloor\frac{m}{i}\rfloor}\rfloor) min(⌊inn,imm⌋)

    对于平方和, ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^{n} i^2= \frac{n(n+1)(2n+1)}{6} i=1ni2=6n(n+1)(2n+1)。证明可以考虑归纳证明,或者构造一个三次多项式证明。

    时间复杂度 O ( n ) O(\sqrt n) O(n )

    实现:

    考虑到乘法操作会爆 long long,可以取模用逆元或者 __int128

    需注意 19940417 不是质数。

    代码

    [ARC068E] Snuke Line

    对于每个 d d d [ l i , r i ] [l_i,r_i] [li,ri] d d d 的倍数个数为 ⌊ r i d ⌋ − ⌊ l i − 1 d ⌋ \lfloor\frac{r_i}{d}\rfloor - \lfloor\frac{l_i-1}{d}\rfloor dridli1,即求 ∑ i = 1 n [ ⌊ r i d ⌋ − ⌊ l i − 1 d ⌋ > 0 ] \sum_{i=1}^n [\lfloor\frac{r_i}{d}\rfloor - \lfloor\frac{l_i-1}{d}\rfloor >0] i=1n[⌊dridli1>0]

    对于每个 i i i,对所有的 d d d 做数论分块,对每个块做区间加操作,单点查询,考虑差分。

    时间复杂度 O ( n m ) O(n \sqrt m) O(nm )代码

    考虑到 d ∈ [ l i , r i ] d \in [l_i,r_i] d[li,ri] 一定可行,加上这个剪枝即可通过本题。代码

  • 相关阅读:
    前端构建工具用得好,构建速度提升 10 倍
    工业级数据分发服务DDS之安全篇
    在centOS上安装redis步骤
    98. 验证二叉搜索树 ●●
    计算机网络(TCP协议)
    【LowCode Talk】前端大佬姚老师、狼叔怎么看:低代码会让程序员失业?
    2024最新华为OD算法题目
    STM32物联网项目-SHT30温湿度采集(IIC通信)
    机器人软硬件系统集成
    【设计模式】Java设计模式 - 中介者模式
  • 原文地址:https://blog.csdn.net/weixin_73113801/article/details/133908563