TREENUM - Tree Num

Tác giả: ll931110

Ngôn ngữ: Pascal

{$MODE DELPHI}
Program TREENUM;
Const
  input  = '';
  output = '';
  maxk = 63;
  kmod = 100000000;
Var
  fi,fo: text;
  t,i: integer;
  n: qword;
  d2: array[0..maxk] of qword;
  d3: array[0..maxk,1..5] of integer;
  d: array[1..5] of integer;
  s: array[1..maxk] of integer;

Procedure openfile;
Begin
  Assign(fi, input);
    Reset(fi);

  Assign(fo, output);
    Rewrite(fo);
End;

Procedure gens;
Var
  i,j: integer;
Begin
  d2[0]:= 1;
  For i:= 1 to maxk do d2[i]:= d2[i - 1] * 2;

  Fillchar(d3, sizeof(d3), 0);
  d3[0,1]:= 1;

  For i:= 1 to maxk do
    Begin
      For j:= 1 to 4 do d3[i,j]:= d3[i - 1,j] * 3;
      For j:= 1 to 4 do if d3[i,j] >= kmod then
        Begin
          d3[i,j + 1]:= d3[i,j + 1] + d3[i,j] div kmod;
          d3[i,j]:= d3[i,j] mod kmod;
        End;
    End;
End;

Procedure solve;
Var
  num,i,j,k: integer;
Begin
  num:= 0;
  For i:= maxk downto 0 do if n >= d2[i] then
    Begin
      inc(num);
      s[num]:= i;
      n:= n - d2[i];
    End;

  Fillchar(d, sizeof(d), 0);
  For i:= 1 to num do
    Begin
      k:= s[i];
      For j:= 1 to 4 do d[j]:= d[j] + d3[k,j];
      For j:= 1 to 4 do if d[j] >= kmod then
        Begin
          d[j + 1]:= d[j + 1] + d[j] div kmod;
          d[j]:= d[j] mod kmod;
        End;
    End;
End;

Procedure printresult;
Var
  st: string;
  i,j,k: integer;
Begin
  k:= 4;
  While d[k] = 0 do dec(k);
  Write(fo, d[k]);

  For i:= k - 1 downto 1 do
    Begin
      str(d[i], st);
      For j:= length(st) + 1 to 8 do write(fo, 0);
      Write(fo, st);
    End;

  Writeln(fo);
End;

Procedure closefile;
Begin
  Close(fo);
  Close(fi);
End;

Begin
  openfile;
  gens;

  Readln(fi, t);
  For i:= 1 to t do
    Begin
      Readln(fi, n);
      solve;
      printresult;
    End;

  closefile;
End.

Download