题目描述
形如2^{P}-12P−1 的素数称为麦森数,这时PP 一定也是个素数。但反过来不一定,即如果PP 是个素数,2^{P}-12P−1 不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377P=3021377 ,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入PP (1000<P<31000001000<P<3100000 ),计算2^{P}-12P−1 的位数和最后500位数字(用十进制高精度数表示)
输入输出格式
输入格式:文件中只包含一个整数PP (1000<P<31000001000<P<3100000 )
输出格式:第一行:十进制高精度数2^{P}-12P−1 的位数。
第2-11行:十进制高精度数2^{P}-12P−1 的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2^{P}-12P−1 与PP 是否为素数。
输入输出样例
输出样例#1:
复制
386 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000104079321946643990819252403273640855 38615262247266704805319112350403608059673360298012 23944173232418484242161395428100779138356624832346 49081399066056773207629241295093892203457731833496 61583550472959420547689811211693677147548478866962 50138443826029173234888531116082853841658502825560 46662248318909188018470682222031405210266984354887 32958028878050869736186900714720710555703168729087
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
#define maxn 1005
using namespace std;
int f[maxn];//储存2的次方
int c[maxn];//储存答案
int sav[maxn];//临时数组储存中间值
void Print(int a[])
{
int i=500;
while(a[i]==0)i--;
for(int j=i;j>=1;j--)
{
cout<<a[j];
}
cout<<endl;
}
void Copy(int a[],int b[])
{
for(int i=1;i<=500;i++)
{
a[i]=b[i];
}
}
void sov1()
{
memset(sav,0,sizeof(sav));
for(int i=1;i<=500;i++)
{
for(int j=1;j<=500;j++)
{
sav[i+j-1]+=f[i]*c[j];
}
}
for(int i=1;i<=500;i++)
{
sav[i+1]+=sav[i]/10;
sav[i]=sav[i]%10;
}
Copy(c,sav);
}
void sov2()
{
memset(sav,0,sizeof(sav));
for(int i=1;i<=500;i++)
{
for(int j=1;j<=500;j++)
{
sav[i+j-1]+=f[i]*f[j];
}
}
for(int i=1;i<=500;i++)
{
sav[i+1]+=sav[i]/10;
sav[i]%=10;
}
Copy(f,sav);
}
int main()
{
int p;
cin>>p;
int t=log10(double(2))*p+1;
cout<<t<<endl;
c[1]=1;
f[1]=2;
while(p)
{
if(p&1==1)
{
sov1();
}
sov2();
p>>=1;
}
int cnt=0;
c[1]-=1;
for(int i=500;i>=1;i--)
{
cout<<c[i];
cnt++;
if(cnt%50==0)
{
cout<<endl;
}
}
}