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.
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