LSPITO - Help Conan ! (version 3)

Tác giả: ll931110

Ngôn ngữ: Pascal

program LSPITO;
const
  input  = '';
  output = '';
  maxn = 20;
var
  list: array[1..20] of int64;
  pp: array[0..20] of int64;
  n: int64;
  fi,fo: text;

procedure getlist;
var
  k: integer;
  q: int64;
begin
  pp[0] := 1;
  for k := 1 to maxn do pp[k] := pp[k - 1] * 2;

  list[1] := 2;
  for k := 1 to maxn - 1 do
    begin
      q := (pp[k] - 1) * 3 * pp[k] + pp[k + 1];
      list[k + 1] := list[k] + q;
    end;
end;

procedure openfile;
begin
  assign(fi, input);
    reset(fi);

  assign(fo, output);
    rewrite(fo);
end;

procedure solve;
var
  i: integer;
  t,inf,sup,med,tmp: int64;
  flag: boolean;
begin
  if n < 2 then
    begin
      if n = 1 then writeln(fo, 'Conan') else writeln(fo, 'Thu Uyen');
      exit;
    end;

  i := 1;
  while n > list[i] do inc(i);

  if n = list[i] then
    begin
      writeln(fo, 'Thu Uyen');
      exit;
    end;

  dec(i);
  t := n - list[i];

  flag := true;
  inf := pp[i] + 1;
  sup := pp[i + 1] - 1;

  repeat
    med := (inf + sup) div 2;
    tmp := (med - pp[i]) * (med + pp[i] + 1);
    if tmp = t then
      begin
        flag := false;
        break;
      end
    else if tmp < t then inf := med + 1 else sup := med - 1;
  until inf > sup;

  inf := pp[i] + 1;
  sup := pp[i + 1] - 1;
  repeat
    med := (inf + sup) div 2;
    tmp := (med - pp[i]) * (med + pp[i] + 1);
    if tmp = t + med then
      begin
        flag := false;
        break;
      end
    else if tmp < t + med then inf := med + 1 else sup := med - 1;
  until inf > sup;

  if flag then writeln(fo, 'Conan') else writeln(fo, 'Thu Uyen');
end;


procedure closefile;
begin
  close(fi);
  close(fo);
end;

begin
  getlist;
  openfile;

  while not eof(fi) do
    begin
      readln(fi, n);
      solve;
    end;
  closefile;
end.

Download