1 条题解

  • 0
    @ 2026-6-19 10:31:04

    📝 题目大意

    给定整数 XXYY1XY10181 \le X \le Y \le 10^{18}),构造一个严格递增的整数序列,首项为 XX,所有项均在 [X,Y][X, Y] 范围内,且每一项是前一项的倍数。求该序列的最大可能长度。

    💡 解题思路

    1. 题目分析:要使序列尽可能长,每一步的倍增因子应尽量小。由于 Ai+1>AiA_{i+1} > A_iAi+1A_{i+1}AiA_i 的倍数,最小合法的倍增因子为 22。因此,最优策略是每一步都乘以 22,即序列为 X,2X,4X,8X,X, 2X, 4X, 8X, \dots,直到超过 YY 为止。

    2. 算法推导

      • i=Xi = X 开始,每次将 ii 乘以 22,计数器 ans11
      • i>Yi > Y 时停止,此时 ans 即为序列的最大长度。
      • 这实际上等价于求最大的 kk 使得 X2k1YX \cdot 2^{k-1} \le Y,即 $k = \left\lfloor \log_2 \frac{Y}{X} \right\rfloor + 1$。
      • 由于 Y1018Y \le 10^{18},最多迭代约 6060 次,直接模拟即可。
    3. 边界与细节

      • X=YX = Y 时,序列仅含一项,答案为 11
      • 注意使用 long long 类型,避免溢出(YY 最大可达 101810^{18},乘以 22 后可能超过 int 范围,但 long long 足够安全,因为循环条件 iYi \le Y 会在溢出前触发退出判断;实际上 ii 最大可能达到约 260×X2^{60} \times X,用 long long 时一旦溢出为负数,循环会自动终止,结果依然正确)。

    ⏱️ 复杂度分析

    • 时间复杂度O(logYX)O(\log \frac{Y}{X}),即 O(logY)O(\log Y),最多约 6060 次迭代。
    • 空间复杂度O(1)O(1),仅使用常数级变量。

    💻 标准代码 (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
    上传者