所谓梅森数,是指形如 2^p-1的一类数,其中指数 p是素数,常记为 Mp 。如果梅森数是素数,就称为梅森素数。
用因式分解法可以证明,若 2^p-1是素数,则指数 p 也是素数;反之,当 p 是素数时,2^p-1(即 Mp)却未必是素数。前几个较小的梅森数大都是素数,然而梅森数越大,梅森素数也就越难出现。
目前仅发现 5050 个梅森素数,最大的是 2^{77232917}-1(即 22 的 7723291777232917 次方减 11),有 2324942523249425 位数。
蒜头君对梅森数很感兴趣,他想知道 2^n-1是多少(nn 不一定为素数)。因为他的纸太小了,记不下很长位数的数,所以他只想知道 2^n-1 的总共位数和最后 500500 位的内容。
现在蒜头君请你帮忙解决这个问题。
输入格式
读入一个整数 n(1≤n≤2×10^5 )。
输出格式
第一行,输出 2^n-1在十进制下的位数。
接下来输出 2^n-1的后 500500 位数字。分 1010 行输出,每行输出 5050 位数字,总位数不足 500500 时用前导零补全。
输出时每行末尾的多余空格,不影响答案正确性
要求使用「文件输入输出」的方式解题,输入文件为 number.in,输出文件为 number.out
样例输入复制
1314
样例输出复制
396
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00003576138271605527980188906553837526501863927718
27791700228253075109865512133592791379099057679693
03967974447796301739334126330886102718957287891634
45110276848452872445767618105602690745648658721348
23408348699505180053107808949626266465208626436136
41027300686118138792433895010169856288846376112519
00367527465972992627467968504165609862277906496909
74816461930231090506595820885016767800022751248383
#include<bits/stdc++.h>
using namespace std;
int a[1000],n;
int main(){
cin>>n;
cout<<(int)(n*log10(2))+1<<endl;
a[0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<500;j++)a[j]*=2;
for(int j=0;j<500;j++){
a[j+1]+=a[j]/10;
a[j]%=10;
}
}
a[0]--;
for(int i=0;i<10;i++){
for(int j=0;j<50;j++)cout<<a[499-i*50-j];
cout<<endl;
}
return 0;
}