1 条题解
-
0
📝 题目大意
给定整数 和 (),构造一个严格递增的整数序列,首项为 ,所有项均在 范围内,且每一项是前一项的倍数。求该序列的最大可能长度。
💡 解题思路
-
题目分析:要使序列尽可能长,每一步的倍增因子应尽量小。由于 且 是 的倍数,最小合法的倍增因子为 。因此,最优策略是每一步都乘以 ,即序列为 ,直到超过 为止。
-
算法推导:
- 从 开始,每次将 乘以 ,计数器
ans加 。 - 当 时停止,此时
ans即为序列的最大长度。 - 这实际上等价于求最大的 使得 ,即 $k = \left\lfloor \log_2 \frac{Y}{X} \right\rfloor + 1$。
- 由于 ,最多迭代约 次,直接模拟即可。
- 从 开始,每次将 乘以 ,计数器
-
边界与细节:
- 时,序列仅含一项,答案为 。
- 注意使用
long long类型,避免溢出( 最大可达 ,乘以 后可能超过int范围,但long long足够安全,因为循环条件 会在溢出前触发退出判断;实际上 最大可能达到约 ,用long long时一旦溢出为负数,循环会自动终止,结果依然正确)。
⏱️ 复杂度分析
- 时间复杂度:,即 ,最多约 次迭代。
- 空间复杂度:,仅使用常数级变量。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int main() { long long x, y; // 输入范围 X, Y(1 ≤ X ≤ Y ≤ 10^18) cin >> x >> y; int ans = 0; // 序列长度计数器 // 从 X 开始,每次乘以 2,统计序列长度直到超过 Y for (long long i = x; i <= y; i *= 2) { ans++; // 每找到一个合法项,长度 +1 } cout << ans << endl; // 输出最大长度 return 0; } -
- 1
信息
- ID
- 849
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者