数论分块

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

UVA11526 H(n)

题意: 求 ∑ i = 1 n n i \sum_{i=1}^{n} \frac {n}{i} ∑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=⌊⌊in⌋n⌋。

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

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

代码

AHOI2005 约数研究

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

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

代码

约数和

同样考虑约数的贡献,即求 ∑ 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=1nn,long long 即可。

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

代码

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=1∑nkmodi=i=1∑n(k−⌊ik⌋i)=nk−i=1∑n⌊ik⌋i

枚举到 k k k 即可, n , k n,k n,k 同阶时时间复杂度 O ( n ) O(\sqrt n) O(n )。

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⌋=a−⌊ba⌋b

⌊ 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+1∣a。

由 ⌊ a b ⌋ < b \lfloor \frac{a}{b} \rfloor < b ⌊ba⌋<b,得 a < b 2 + b a < b^2+b a<b2+b。

而 b + 1 ∣ a b+1 \mid a b+1∣a,由 a < b 2 + b a < b^2+b a<b2+b,得 b ∤ a b \nmid a b∤a,故 ⌊ 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+1∣a 且 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=1∑yb+1min(x,b2+b−1)。

分段整除分块即可。

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

代码

法二(官方做法)

记 ⌊ 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 b≤kx−1,且 k < b ≤ y k < b \le y k<b≤y。

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

代码

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·2 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码2 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int2 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++