题解:P1045 [NOIP 2003 普及组] 麦森数
这道题目看上去十分简单,只需要算出
但是当我们写好高精度的时候就会发现超时了,
改进的方法有很多,例如在高精度乘法时不是每次乘以 unsigned long long最多只能够表示
另外计算位数,我们可以通过对数的基本性质:
综上所述,就可以得到以下代码:
#include <iostream>
#include <cmath>
using namespace std;
unsigned long long a[510] = {0, 1}, t;
int p;
int main()
{
cin >> p;
cout << (int)(p * log10(2)) + 1 << endl;
for (; p >= 0; p -= 60)
{
t = 0;
for (int j = 1; j <= 500; j++)
{
if (p >= 60) a[j] <<= 60;
else a[j] <<= p;
a[j] += t;
t = a[j] / 10;
a[j] %= 10;
}
}
a[1] -= 1;
for (int i = 500; i >= 1; i--)
{
cout << (char)('0' + a[i]);
if (i % 50 == 1) cout << endl;
}
return 0;
}