整除分块(非得五个字才能发,括号里都是凑字数的)
整除分块用于解决形如
∑
i
=
1
n
⌊
n
/
i
⌋
\sum_{i=1}^{n} \lfloor n/i \rfloor
∑i=1n⌊n/i⌋
的问题。
暴力解决的话复杂度为 O ( N ) O(N) O(N),整出分块后复杂度可以降低到 O ( N ) O(\sqrt N) O(N)
暴力打表可以看到的是,其中有一些连续的区间的 ⌊ n / i ⌋ \lfloor n/i \rfloor ⌊n/i⌋的值是相同的,呈现一个块状的分布,因此如果找出这些块并且按照块来计算的话,复杂度可以得到下降。
[ x , ⌊ n / ⌊ n / x ⌋ ⌋ ] [x, \lfloor n / \lfloor n / x \rfloor\rfloor] [x,⌊n/⌊n/x⌋⌋]这个区间内的 ⌊ n / i ⌋ \lfloor n / i\rfloor ⌊n/i⌋的值是相同的, i i i是区间内任意一个整数。
证明:
⌊
n
/
i
⌋
=
k
\lfloor n/i\rfloor=k
⌊n/i⌋=k等同于
①
k
×
i
+
p
=
n
,
1
≤
p
<
i
①k\times i+p=n,1\leq p <i
①k×i+p=n,1≤p<i,若
⌊
n
/
(
i
+
d
)
⌋
=
k
\lfloor n/(i+d)\rfloor=k
⌊n/(i+d)⌋=k,就有
②
k
×
(
i
+
d
)
+
p
′
=
n
②k \times (i+d) + p'=n
②k×(i+d)+p′=n,
②
−
①
②-①
②−①变形得
p
′
=
p
−
k
×
d
p'=p-k\times d
p′=p−k×d,其中
③
d
③d
③d取最大值为
⌊
p
/
k
⌋
\lfloor p/k\rfloor
⌊p/k⌋
就有
i
′
=
i
+
d
m
a
x
=
i
+
⌊
p
/
k
⌋
i'=i+d_{max}=i+\lfloor p/k \rfloor
i′=i+dmax=i+⌊p/k⌋,其中
p
=
n
%
i
=
n
−
⌊
n
/
i
⌋
×
i
p=n\% i=n-\lfloor n/i \rfloor \times i
p=n%i=n−⌊n/i⌋×i,
k
=
⌊
n
/
i
⌋
=
⌊
n
/
(
i
+
d
)
⌋
k=\lfloor n/i \rfloor = \lfloor n/(i+d) \rfloor
k=⌊n/i⌋=⌊n/(i+d)⌋,带入得如下:
= i + ⌊ ( n − ⌊ n / i ⌋ × i ) ⌋ ⌊ n / i ⌋ =i+\frac{\lfloor (n-\lfloor n/i \rfloor \times i) \rfloor}{\lfloor n/i \rfloor} =i+⌊n/i⌋⌊(n−⌊n/i⌋×i)⌋
= ⌊ i + ⌊ n − ⌊ n / i ⌋ × i ⌊ n / i ⌋ ⌋ ⌋ =\lfloor i+\lfloor \frac{n-\lfloor n/i \rfloor \times i}{\lfloor n/i \rfloor} \rfloor \rfloor =⌊i+⌊⌊n/i⌋n−⌊n/i⌋×i⌋⌋
= ⌊ i × ⌊ n / i ⌋ + n − ⌊ n / i ⌋ × i ⌊ n / i ⌋ ⌋ =\lfloor \frac{i\times \lfloor n/i \rfloor + n - \lfloor n/i \rfloor \times i}{\lfloor n/i \rfloor} \rfloor =⌊⌊n/i⌋i×⌊n/i⌋+n−⌊n/i⌋×i⌋
= ⌊ n ⌊ n / i ⌋ ⌋ =\lfloor \frac{n}{\lfloor n/i \rfloor} \rfloor =⌊⌊n/i⌋n⌋
即得到了最大的和它相等的值就是下面这个
⌊ n ⌊ n / i ⌋ ⌋ \lfloor \frac{n}{\lfloor n/i \rfloor} \rfloor ⌊⌊n/i⌋n⌋
补充:
③证明
p ′ p' p′是余数,所以 p ′ ≥ 0 p'\geq 0 p′≥0,若 d m a x = y > ⌊ p k ⌋ d_{max} =y>\lfloor \frac{p}{k} \rfloor dmax=y>⌊kp⌋,则 p ′ = p − k × d m a x < 0 p' = p-k \times d_{max} <0 p′=p−k×dmax<0,与 p ′ ≥ 0 p' \geq0 p′≥0矛盾,因此 d m a x d_{max} dmax最大值不会大于 ⌊ p k ⌋ \lfloor \frac{p}{k} \rfloor ⌊kp⌋,而d= ⌊ p k ⌋ \lfloor \frac{p}{k} \rfloor ⌊kp⌋时满足条件,因此 ⌊ p k ⌋ \lfloor \frac{p}{k} \rfloor ⌊kp⌋是最大值。#
作者: correct
出处:https://www.cnblogs.com/correct/p/16548404.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现