显示原始代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 505;
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int res[N], tmp[N];
void mul(const int a[], const int b[], int c[]) {
for (int i = 1; i < N; i++) {
for (int j = 1; i + j - 1 <= 500; j++) {
c[i + j - 1] += a[i] * b[j];
}
}
for (int i = 1; i <= 500; i++) {
if (c[i] >= 10)
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
void qpow(int x[], int k) {
for (int i = 1; i <= 500; i++) res[i] = 0;
res[1] = 1;
while (k) {
if (k & 1) {
for (int i = 1; i <= 500; i++) tmp[i] = 0;
mul(res, x, tmp);
for (int i = 1; i <= 500; i++) res[i] = tmp[i];
}
for (int i = 1; i <= 500; i++) tmp[i] = 0;
mul(x, x, tmp);
for (int i = 1; i <= 500; i++) x[i] = tmp[i];
k >>= 1;
}
}
int x[N];
signed main() {
int n = read();
memset(x, 0, sizeof(x));
x[1] = 2;
qpow(x, n);
int k = 1;
res[1] -= 1;
while (res[k] < 0 && k <= 500) {
res[k] += 10;
res[k + 1] -= 1;
k++;
}
int p = 500;
for (; p; p--)
if (res[p])
break;
int num = ceil(1.0 * n * log10(2));
printf("%lld\n", max(p, num));
for (int i = 1; i <= 500 - p; i++) {
putchar('0');
if (i % 50 == 0)
putchar('\n');
}
for (int i = p; i; i--) {
printf("%d", res[i]);
if ((500 - i + 1) % 50 == 0)
putchar('\n');
}
return 0;
}