- 麦森数
- 2021-07-29 12:46:39 @
#include<bits/stdc++.h>
using namespace std;
const int Max_M=500;
int n;
int Out[Max_M];
int Power[2*Max_M];
void DFS(int n){
int i,j;
if (n==0) return;
DFS(n/2);
for (i=1;i<=500;i++)
for (j=1;j<=500;j++)//分拆为两个数
if(n%2==0) Power[i+j-1]=Power[i+j-1]+Out[i]*Out[j];//偶数,分拆两个
else
Power[i+j-1]=Power[i+j-1]+Out[i]*Out[j]*2;//奇数,分拆两个,再加上剩余的2
for(i=1;i<=500;i++){//进位
Out[i]=Power[i]%10;
Power[i+1]=Power[i+1]+Power[i]/10;
}
memset(Power,0,sizeof(Power));
}
int main(){
freopen("mason.in","r",stdin);freopen("mason.out","w",stdout);
cin>>n;
cout<<int((log(2)/log(10)*n)+1)<<endl;//对数换底,求位数
Out[1]=1;
DFS(n);
for(int i=500;i>=2;i--){
cout<<Out[i];
if (i%50==1) cout<<endl;
}
cout<<Out[1]-1<<endl;
return 0;
}
1 条评论
-
上海娄山 LV 8 @ 2021-07-29 21:33:25
找到问题了,MaxM定义太小了,改成510就过了
- 1