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.





Download