提交时间:2026-03-27 20:35:34
运行 ID: 86285
#include <iostream> #include <cmath> #include <vector> #include <cstring> using namespace std; // 高精度乘法:res = a * b,只保留最后 500 位 void multiply(int a[], int b[]) { int temp[501] = {0}; for (int i = 0; i < 500; i++) { for (int j = 0; j + i < 500; j++) { // 结果只取前 500 位,所以 i + j < 500 temp[i + j] += a[i] * b[j]; } } // 处理进位 for (int i = 0; i < 500; i++) { if (temp[i] >= 10) { if (i < 499) temp[i + 1] += temp[i] / 10; temp[i] %= 10; } } memcpy(a, temp, sizeof(temp)); } int main() { int p; cin >> p; // 1. 输出位数 // floor(p * log10(2)) + 1 int digits = (int)(p * log10(2)) + 1; cout << digits << endl; // 2. 快速幂计算 2^p 的最后 500 位 int res[501] = {0}; int base[501] = {0}; res[0] = 1; // 结果初始为 1 base[0] = 2; // 底数初始为 2 while (p > 0) { if (p % 2 == 1) { multiply(res, base); // 如果 p 是奇数,乘到结果里 } multiply(base, base); // 底数自乘 p /= 2; } // 2^p - 1,只需要个位减1即可(因为 2^p 个位一定是 2, 4, 8, 6,减1不涉及借位) res[0] -= 1; // 3. 格式化输出最后 500 位 // 每行 50 个,共 10 行,从高位 (index 499) 往低位 (index 0) 打印 for (int i = 499; i >= 0; i--) { cout << res[i]; if (i % 50 == 0) cout << endl; } return 0; }