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