1 条题解

  • 0
    @ 2026-6-19 10:30:35

    📝 题目大意

    给定一个长度为 64 的 0/1 数列 A0A63A_0 \sim A_{63},计算 $A_0 \cdot 2^0 + A_1 \cdot 2^1 + \cdots + A_{63} \cdot 2^{63}$ 的值。

    💡 解题思路

    1. 题目分析:输入固定 64 个数,每个数只能是 0 或 1。本质就是将 64 位二进制数(低位在前)转换为十进制。由于 2632^{63}9.2×10189.2 \times 10^{18},最大值 26411.84×10192^{64}-1 \approx 1.84 \times 10^{19},超过 signed long long 的表示范围(26319.2×10182^{63}-1 \approx 9.2 \times 10^{18}),因此必须使用 unsigned long long 存储答案。

    2. 算法推导

      • unsigned long long ans = 0 存储累加结果。
      • 遍历 ii 从 0 到 63,每次读入一个数 a
      • a=1a = 1,则 ans += 1ULL << i(即加上 2i2^i)。
      • 注意 1ULL << i 中的 ULL 后缀确保位移运算在 64 位无符号整数上进行,避免 int 移位溢出(1 << 63 对 32 位 int 是未定义行为)。
      • 最后输出 ans
    3. 边界与细节

      • 使用 unsigned long long 而非 long long,因为答案可能达到 26412^{64}-1,超出有符号 64 位整数的正数范围。
      • 1ULLULL 后缀不可省略,否则 1 默认为 int 类型,1 << 63 会产生未定义行为。
      • 输入顺序是 A0A_0A63A_{63},对应权值 202^02632^{63},直接按位加即可,无需反转。

    ⏱️ 复杂度分析

    • 时间复杂度O(64)O(64),即 O(1)O(1),固定 64 次迭代。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include <iostream>
    using namespace std;
    
    int main() {
        // 使用 unsigned long long 存储答案,因为最大值 2^64-1 超出 signed long long 范围
        unsigned long long ans = 0;
        int a;
        for (int i = 0; i < 64; i++) {
            cin >> a;
            if (a == 1) {
                // 1ULL << i 计算 2^i,ULL 保证位移在 64 位无符号整数上进行
                ans += (1ULL << i);
            }
        }
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    718
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者