提交时间:2026-02-05 16:16:08
运行 ID: 84017
#include <iostream> #include <vector> #include <algorithm> using namespace std; class BigInt { vector<uint32_t> digits; // 每个元素存储 32 位(提高性能) static const uint32_t BASE = 1e9; // 10^9,减少位数 public: BigInt(uint64_t num = 0) { while (num > 0) { digits.push_back(num % BASE); num /= BASE; } } // 左移 n 位(相当于乘以 2^n) void shift_left(int n) { if (digits.empty()) return; int shift_blocks = n / 32; // 每个 block 是 32 位 int shift_bits = n % 32; // 处理块内移位 for (size_t i = 0; i < digits.size(); ++i) { uint64_t carry = static_cast<uint64_t>(digits[i]) << shift_bits; if (i + 1 < digits.size()) { carry |= digits[i + 1] >> (32 - shift_bits); } digits[i] = carry & (BASE - 1); } // 处理最高位的进位 uint64_t carry = static_cast<uint64_t>(digits.back()) >> (32 - shift_bits); if (carry > 0) { digits.push_back(carry & (BASE - 1)); } // 处理块间移位 digits.insert(digits.begin(), shift_blocks, 0); } // 减去一个小的数(如 2) void subtract_small(uint32_t num) { if (digits.empty()) { digits.push_back(0); } digits[0] -= num; for (size_t i = 0; i + 1 < digits.size(); ++i) { if (digits[i] > BASE) { // 实际上应该是 digits[i] < 0(需要借位) digits[i] += BASE; digits[i + 1]--; } } // 移除前导零 while (digits.size() > 1 && digits.back() == 0) { digits.pop_back(); } } friend ostream& operator<<(ostream& os, const BigInt& num) { if (num.digits.empty()) return os << 0; os << num.digits.back(); for (auto it = num.digits.rbegin() + 1; it != num.digits.rend(); ++it) { os.width(9); os.fill('0'); os << *it; } return os; } }; int main() { int n; while(cin >> n){ BigInt result(1); result.shift_left(n + 1); // 2^(n+1) result.subtract_small(2); // -2 cout << result << endl;} return 0; }