数论分块
问题描述
给定一个正整数 \(n\),求当 \(k\) 从 \(1\) 到 \(n\) 时,\(\left\lfloor \frac{n}{k} \right\rfloor\) 的不同取值个数。
分析
理解 \(\left\lfloor \frac{n}{k} \right\rfloor\) 的含义
- \(\left\lfloor \frac{n}{k} \right\rfloor\) 表示 \(n\) 除以 \(k\) 的整数部分。
- 随着 \(k\) 的增加,\(\left\lfloor \frac{n}{k} \right\rfloor\) 逐渐减小或保持不变。
分块
将 \(k\) 的范围分成若干块,使得在每个块内 \(\left\lfloor \frac{n}{k} \right\rfloor\) 保持不变
也就说对于一块Q,左边界是l,右边界是r ,$$\forall i \in [l,r],\left\lfloor \frac{n}{l} \right\rfloor=\left\lfloor \frac{n}{i} \right\rfloor=\left\lfloor \frac{n}{r} \right\rfloor$$
- 对于每个 \(m\),定义 \(\left\lfloor \frac{n}{k} \right\rfloor = m\) 的范围为:\[\frac{n}{m + 1} < k \leq \frac{n}{m}. \]
- 因此,满足上述不等式的整数 \(k\) 的数量为:\[\left\lfloor \frac{n}{m} \right\rfloor - \left\lfloor \frac{n}{m + 1} \right\rfloor. \]
计算不同 \(m\) 值的数量
- 不同的 \(m\) 值的数量等于所有 \(m\) 中,块大小至少为 \(1\) 的 \(m\) 的数量。
- 即,需要满足:\[\left\lfloor \frac{n}{m} \right\rfloor > \left\lfloor \frac{n}{m + 1} \right\rfloor. \]
分布计算
-
前半部分$ k \leq \sqrt{n} $:
每个 $ k $ 对应唯一值 $ \lfloor n/k \rfloor \geq \lfloor \sqrt{n} \rfloor $,因此不同值数量为 $ \lfloor \sqrt{n} \rfloor $ -
后半部分\(k >\sqrt{n}\):
$ \lfloor n/k \rfloor $ 的取值范围为 $ 1 \leq v \leq \lfloor \sqrt{n} \rfloor $,但每个 $ v $ 对应的 $ k $ 区间为 $ \left( \frac{n}{v+1}, \frac{n}{v} \right] $。
因此,有效 $ v $ 的个数为 $ \lfloor \frac{n}{\lfloor \sqrt{n} \rfloor + 1} \rfloor $
答案
不同的 \(m\) 值的数量为:
For example
$ n = 10 $ 时 \(\left\lfloor \frac{n}{k} \right\rfloor\) 不同取值个数
-
计算分界点:
- \(\lfloor \sqrt{10} \rfloor = 3\),将区间分为 \(k \leq 3\) 和 \(k > 3\) 两部分。
-
前半部分(\(k \leq 3\)):
- \(k=1\): \(\lfloor 10/1 \rfloor = 10\)
- \(k=2\): \(\lfloor 10/2 \rfloor = 5\)
- \(k=3\): \(\lfloor 10/3 \rfloor = 3\)
- 不同值数量:3 个(10, 5, 3)。
-
后半部分(\(k > 3\)):
- 计算 \(\lfloor 10/(3+1) \rfloor = \lfloor 10/4 \rfloor = 2\),表示可能的值为 \(2\) 和 \(1\):
- \(k=4\) 和 \(k=5\): \(\lfloor 10/4 \rfloor = 2\), \(\lfloor 10/5 \rfloor = 2\)
- \(k=6\) 到 \(k=10\): \(\lfloor 10/k \rfloor = 1\)
- 不同值数量:2 个(2, 1)。
- 计算 \(\lfloor 10/(3+1) \rfloor = \lfloor 10/4 \rfloor = 2\),表示可能的值为 \(2\) 和 \(1\):
- 总个数:
- \(3 + 2 = 5\) 个不同值:\(\{10, 5, 3, 2, 1\}\)。
列出所有 \(k=1\) 到 \(k=10\) 的结果:
去重后得到 \(\{10, 5, 3, 2, 1\}\),共 5 个不同值,与公式结果一致。
其他例子
- \(n=6\):\(\lfloor \sqrt{6} \rfloor = 2\),后半部分 \(\lfloor 6/(2+1) \rfloor = 2\),总个数 \(2+2=4\)。
实际结果:\(\{6, 3, 2, 1\}\)。 - \(n=9\):\(\lfloor \sqrt{9} \rfloor = 3\),后半部分 \(\lfloor 9/(3+1) \rfloor = 2\),总个数 \(3+2=5\)。
实际结果:\(\{9, 4, 3, 2, 1\}\)。
例题
求\(N\% i,(i \in [1,n])\)前k大余数和
见此题解,G题
本文作者:归游
本文链接:https://www.cnblogs.com/guiyou/p/18696031
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步