P1045麦森数
#include<iostream> #include <cmath> #include <cstring> const int maxn = 1e5 + 10; #define int long long using namespace std; //第一个表示位数,之后的数字表示每个位数上的数 int ans[maxn] = {1, 1}, k[maxn] = {1, 2}, c[maxn]; void muti(int a[], int b[]) { memset(c, 0, sizeof(c)); c[0] = a[0] + b[0]; if (c[0] > 500) c[0] = 500; for (int i = 1; i <= b[0]; i++) {//模拟乘法 32 * 23 // 3 2 // * 2 3 // ——————— // 9 6 // 6 4 // ———————— // 7 3 6 for (int j = 1; j <= a[0]; j++) { c[j + i - 1] += b[i] * a[j]; if (c[j + i - 1] > 9) { c[i + j] += c[i + j - 1] / 10; c[i + j - 1] %= 10; } } } for (int i = 0; i <= c[0]; i++) a[i] = c[i]; } void quick(int x)//快速幂 { while (x) { if (x & 1) muti(ans, k); muti(k, k); x >>= 1; } } signed main() { int x; cin >> x; cout << (int) (x * log10(2) + 1); quick(x); ans[1]--;//-1操作 for (int i = 500; i >= 1; i--) { if (i % 50 == 0) cout << endl; cout << ans[i]; } return 0; }