代码丑陋,见谅。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=500;
const int N=909526;
int num[N],len=0,p,n;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int a[N],b[N],c[N];
int s(int *temp,int lent)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=0;i<=lent;i++)
a[i]=temp[i],b[i]=temp[i];
int up=0;
for(int j=0;j<=lent;j++)
{
up=0;
for(int i=0;i<=lent;i++)
{
c[i+j]+=a[i]*b[j]+up;//printf("%d %d %d\n",a[i],b[j],c[i+j]);
up=c[i+j]/10;
c[i+j]%=10;
}
c[lent+j]=up;
}
int lenc=lent*2;
while(lenc>0&&c[lenc]==0)
lenc--;//printf("lenc=%d\n",lenc);
for(int i = lenc; i >=0 ; i--) // 逆序输出
cout << c[i];cout<<endl;
len=lenc;
return *c;
}
int ksm(int k)
{
if(k*2>n) return 0;//printf("k=%d len=%d\n",k,len);
*num=s(num,len);
/*for(int i = len; i >=0 ; i--) // 逆序输出
cout << num[i];cout<<endl;*/
p=pow(2,k);
ksm(p);
}
int main()
{
ll res,j=0,a=0;
num[0]=2;
n=read();
ksm(1);
printf("%d\n",len);
if(len-1<500)
{
a=500-len;
for(int i=0;i<a;i++)
{
j++;
printf("0");
if(j==50) j=0,printf("\n");
}
}
j--;
if(len>500) a=len-500;
else a=0;
for(int i=0;i<len;i++)
{
if(num[0]>=1)
{
num[0]-=1;
break;
}
else
{
if(num[i]>=i)
{
for(int y=i-1;y>=0;y--)
num[y]+=1;
num[0]-=1;
break;
}
}
}
for(int i=len-1;i>=a;i--)
{
j++;
printf("%d",num[i]);
if(j==50) j=0,printf("\n");
}
return 0;
}