TREENUM - Tree Num
Tác giả: flashmt
Ngôn ngữ: Pascal
const base=100000000;
type bignum=array[0..10] of longint;
var t,i,j,l,z:integer;
s:string;
n:int64;
a:array[0..65] of bignum;
re:bignum;
procedure multi(var x:bignum;y:bignum);
var i,mem:longint;
begin
mem:=0;
for i:=1 to y[0] do
begin
x[i]:=y[i]*3+mem;
if x[i]<base then mem:=0
else
begin
mem:=x[i] div base; x[i]:=x[i] mod base;
end;
end;
x[0]:=i;
if mem>0 then
begin
x[0]:=x[0]+1;
x[x[0]]:=mem;
end;
end;
procedure plus(var x:bignum;y,z:bignum);
var i,mem,max:longint;
begin
mem:=0;
if z[0]>y[0] then max:=z[0] else max:=y[0];
for i:=1 to max do
begin
x[i]:=z[i]+y[i]+mem;
if x[i]<base then mem:=0
else
begin x[i]:=x[i] mod base; mem:=1; end;
end;
x[0]:=max;
if mem>0 then
begin
x[0]:=x[0]+1;
x[x[0]]:=mem;
end;
end;
procedure init;
var i:longint;
begin
fillchar(a,sizeof(a),0);
a[0,0]:=1; a[0,1]:=1;
for i:=1 to 65 do
multi(a[i],a[i-1]);
end;
begin
init;
readln(t);
for i:=1 to t do
begin
readln(n);
fillchar(re,sizeof(re),0);
j:=0;
while n>0 do
begin
if n and 1 = 1 then plus(re,re,a[j]);
n:=n shr 1;
inc(j);
end;
for j:=re[0] downto 1 do
begin
if j<re[0] then
begin
str(re[j],s);
l:=length(s);
for z:=l+1 to 8 do write(0);
end;
write(re[j]);
end;
writeln;
end;
end.