program mason_number;
var
a,b:array[1..100000] of longint;
n,i,m,x,mark:longint;
begin
readln(n);
n:=n-1;
a[1]:=2;
for m:=1 to n do
begin
for i:=1 to 100000 do
begin
a[i]:=a[i]*2+x;
x:=a[i] div 10;
a[i]:=a[i] mod 10;
end;
end;
i:=0;
while a[i]=0 do
begin
i:=i+1;
end;
a[i]:=a[i]-1;
for x:=1 to i-1 do a[x]:=9;
i:=100000;
while a[i]=0 do i:=i-1;
mark:=i;
writeln(mark);
for i:=500 downto 1 do write(a[i]);
end.
#include<cstring>
#include<cmath>
#include<iostream>
#define MAX_N 570
using namespace std;
typedef struct
{
long a[MAX_N];
}bign;
void mul(bign &c,bign &a,bign &b)
{
memset(c.a,0,sizeof(c.a));
for(long i=0;i<=499;i++)
for(long j=0;j<=499-i;j++)
c.a[i+j]+=a.a[i]*b.a[j];
for(long i=0;i<=499;i++)
if(c.a[i]>=10)
{
c.a[i+1]+=c.a[i]/10;
c.a[i]%=10;
}
c.a[500]=0;
}
int main()
{
long n,m,count;
bign _2[MAX_N]={{1},{2}},ans={{1}},t;
cin>>n;
cout<<(long)(n*log10(2))+1<<endl;
m=(long)(log(n)/log(2))+3;
for(long i=2;i<=m;i++)
mul(_2[i],_2[i-1],_2[i-1]);
count=0;
while(n>0)
{
if(n%2==1)
{
t=ans;
mul(ans,t,_2[count+1]);
}
count++;
n/=2;
}
ans.a[0]--;
int lona=0;
for(long i=499;i>=0;i--)
{
cout<<ans.a[i];
}
return 0;
}
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,sit[1004],a[504];
void ef(int x){
if(x==0)return;
else ef(x/2);
for(int i=1;i<=500;i++)
for(int j=1;j<=500;j++)
if(x%2==0)sit[i+j-1]+=a[i]*a[j];
else sit[i+j-1]+=a[i]*a[j]*2;
for(int i=1;i<=500;i++){
a[i]=sit[i]%10;
sit[i+1]+=sit[i]/10;
}
memset(sit,0,sizeof(sit));
}
int main(){
memset(sit,0,sizeof(sit));
cin>>n;
cout<<floor(log(2)/log(10)*n)+1<<endl;
a[1]=1;
ef(n);
for(int i=500;i>1;i--){
printf("%d",a[i]);
cout<<a[1]-1<<endl;
return 0;
}
用二分查找做2^n,普通做法会超时
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,sit[1004],a[504];
void ef(int x){
if(x==0)return;
else ef(x/2);
for(int i=1;i<=500;i++)
for(int j=1;j<=500;j++)
if(x%2==0)sit[i+j-1]+=a[i]*a[j];
else sit[i+j-1]+=a[i]*a[j]*2;
for(int i=1;i<=500;i++){
a[i]=sit[i]%10;
sit[i+1]+=sit[i]/10;
}
memset(sit,0,sizeof(sit));
}
int main(){
memset(sit,0,sizeof(sit));
cin>>n;
cout<<floor(log(2)/log(10)*n)+1<<endl;
a[1]=1;
ef(n);
for(int i=500;i>1;i--){
printf("%d",a[i]);
if(i%50==1)printf("\n");
}
cout<<a[1]-1<<endl;
system("pause");
return 0;
}