Hướng dẫn giải của Help Conan ! (version 3)


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

var n:int64;
function calc(x,low,m:int64):int64;
begin
     if low>m then calc:=x
     else calc:=x+(m+low)*(m-low+1);
end;

function pr:boolean;
var x,l,r,m,low,y:int64;
begin
     x:=1;
     while x<=n do x:=x shl 2;
     x:=x shr 2;
     if n=x then exit(false);
     l:=trunc(sqrt(x))+1;
     x:=x-l+1;
     r:=(l-1)*2;
     low:=l;
     while l<=r do
     begin
          m:=(l+r) shr 1;
          y:=calc(x,low,m-1);
          if y+m>n then
          begin
               r:=m-1; continue;
          end;
          if y+m*2<n then
          begin
               l:=m+1; continue;
          end;
          if (y+m=n) or (y+m*2=n) then exit(true)
          else exit(false);
     end;
     pr:=false;
end;

begin
     while not eof do
     begin
          read(n);
          if n=0 then exit;
          if pr then writeln('Thu Uyen')
          else writeln('Conan');
     end;
end.

Code mẫu của ladpro98

#include <bits/stdc++.h>
const int N = 2000000;
const long long lim = trunc(1e12);
using namespace std;
long long a[N];
int n;
long long k;

bool isPow2(long long x) {
    while (x % 2 == 0) x = x / 2;
    if (x == 1) return true;
    return false;
}

bool BS(long long key) {
    int l = 1, r = n, m;
    while (l <= r) {
        m = (l + r) / 2;
        if (a[m] == key) return true;
        if (a[m] < key) l = m + 1; else r = m - 1;
    }
    return false;
}

int main()
{
    int i = 1, cnt = 0;
    long long j = 2;
    for(i=1; i<N; i++) {
        a[i] = a[i-1] + j; cnt++;
        if (a[i] > lim) break;
        if (cnt >= 2) {
            cnt = 0; j++; continue;
        }
        if (isPow2(j)) {
            cnt = 0; j++;
        }
    }
    n = i;
    while (scanf("%lld", &k) == 1) {
        if (BS(k)) printf("Thu Uyen\n");
        else printf("Conan\n");
    }
    return 0;
}

Code mẫu của RR

{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  oo=1000000000000;
var
  f1,f2:text;
  n:int64;
  a:array[1..20000000] of int64;
  sl:longint;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure init;
var
  chuky:longint;
  i,now:int64;
begin
  sl:=1; a[1]:=0; i:=2; chuky:=3; now:=3;
  repeat
    inc(sl); a[sl]:=i;
    i+=chuky;
    if i>=now*now then
      begin
        inc(now);
        inc(chuky);
        inc(i);
      end;
  until i>oo;
end;
var
  mid:longint;
function find(l,r:longint):boolean; inline;
begin
  if (n<a[l]) or (n>a[r]) or (l>r) then exit(false);
  if a[l]=n then exit(true);
  if a[r]=n then exit(true);
  mid:=(l+r)>>1;
  if a[mid]=n then exit(true)
  else if n<a[mid] then exit(find(l,mid-1))
  else exit(find(mid+1,r));
end;
begin
  init;
  openF;
  while not eof(f1) do
    begin
      readln(f1,n);
      if find(1,sl) then writeln(f2,'Thu Uyen')
      else writeln(f2,'Conan');
    end;
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
//#include <math.h>
long long a[2000000],k;

void enter()
{
      long long max1=1000000,max2=1000000,max=max1*max2,t;
      a[1]=0;t=1;k=1;
      while(a[k]<max)
      {
          long long x=a[k]+t;
          if(t*t<=x)
          {
               x++;
               t++;
          }
          k++;
          a[k]=x;        
      }
}
int tim(long long x,long long y,long long n)
{
    if(x+1>=y)
    {
         if(a[x]==n||a[y]==n)
             return 1;
         else 
             return 0;
    }
    else
    {
         if(a[(x+y)/2]>=n)
             return tim(x,(x+y)/2,n);
         else return tim((x+y)/2,y,n);
    }
}
main()
{
      long long n;
      enter();
      while(scanf("%lld",&n)>0)
      {
          if(tim(1,k,n)==1)
              printf("Thu Uyen\n");
          else printf("Conan\n");
      }
}

Code mẫu của ll931110

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.

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.