题目
P1045 麦森数
分析
这题比较简单
只用到了高精乘法
用快速幂的方法
但里面的2次幂用高精度, 乘积和也用高精度就行了
#include<bits/stdc++.h>
using namespace std;
int save[1001], f[1001], res[1001];
void mul_1() {
memset(save, 0, sizeof(save));
for (int i = 1; i <= 500; i++) {
for (int j = 1; j <= 500; j++) {
save[i+j-1] += res[i]*f[j];
save[i+j] += save[i+j-1]/10;
save[j+i-1] %= 10;
}
}
memcpy(res, save, sizeof(res));
}
void mul_2() {
memset(save, 0, sizeof(save));
for (int i = 1; i <= 500; i++) {
for (int j = 1; j <= 500; j++) {
save[i+j-1] += f[i]*f[j];
save[i+j] += save[i+j-1]/10;
save[j+i-1] %= 10;
}
}
memcpy(f, save, sizeof(f));
}
int p;
int main() {
scanf("%d", &p);
printf("%d\n", (int)(log10(2)*p+1));
res[1] = 1;
f[1] = 2;
while (p) {
if (p&1) mul_1();//
p >>= 1;
mul_2();//2 4 8 16
}
res[1] -= 1;
for (int i = 500; i >= 1; i--) {
if (i%50==0 && i != 500) cout << endl << res[i];
else cout << res[i];
}
return 0;
}
天地生一世人, 自足了一世事