1 条题解
-
0
📝 题目大意
给定一个长度为 64 的 0/1 数列 ,计算 $A_0 \cdot 2^0 + A_1 \cdot 2^1 + \cdots + A_{63} \cdot 2^{63}$ 的值。
💡 解题思路
-
题目分析:输入固定 64 个数,每个数只能是 0 或 1。本质就是将 64 位二进制数(低位在前)转换为十进制。由于 约 ,最大值 ,超过
signed long long的表示范围(),因此必须使用unsigned long long存储答案。 -
算法推导:
- 用
unsigned long long ans = 0存储累加结果。 - 遍历 从 0 到 63,每次读入一个数
a。 - 若 ,则
ans += 1ULL << i(即加上 )。 - 注意
1ULL << i中的ULL后缀确保位移运算在 64 位无符号整数上进行,避免int移位溢出(1 << 63对 32 位int是未定义行为)。 - 最后输出
ans。
- 用
-
边界与细节:
- 使用
unsigned long long而非long long,因为答案可能达到 ,超出有符号 64 位整数的正数范围。 1ULL的ULL后缀不可省略,否则1默认为int类型,1 << 63会产生未定义行为。- 输入顺序是 到 ,对应权值 到 ,直接按位加即可,无需反转。
- 使用
⏱️ 复杂度分析
- 时间复杂度:,即 ,固定 64 次迭代。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (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
- 上传者