这道题用公式输出位数
分治做乘方
var
n:longint;i,j:longint;
b:array[1..500] of longint;
a:array[1..1000] of longint;
procedure solve(n:longint);
begin
if n=0 then exit;
solve(n div 2);
for i:=1 to 500 do
for j:=1 to 500 do
if n mod 2=0 then
a[i+j-1]:=a[i+j-1]+b[i]*b[j] else
a[i+j-1]:=a[i+j-1]+b[i]*b[j]*2;
for i:=1 to 500 do
begin
b[i]:=a[i] mod 10;
a[i+1]:=a[i+1]+a[i] div 10;
end;
fillchar(a,sizeof(a),0);
end;
begin
readln(n);
writeln(trunc(ln(2)/ln(10)*n)+1);
b[1]:=1;
solve(n);
for i:=500 downto 2 do
write(b[i]);
writeln(b[1]-1);
end.