Hướng dẫn giải của Recaman's Sequence
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
const maxn=500000; maxk=3100000; var d:array[1..maxk] of byte; a:array[0..maxn] of longint; i,n,j:longint; procedure init; var i:longint; begin fillchar(d,sizeof(d),0); fillchar(a,sizeof(a),0); for i:=1 to maxn do begin if (a[i-1]>i) and (d[a[i-1]-i]=0) then a[i]:=a[i-1]-i else a[i]:=a[i-1]+i; d[a[i]]:=1; end; end; begin init; readln(n); repeat writeln(a[n]); readln(n); until n=-1; end.
Code mẫu của happyboy99x
#include<cstdio> #include<set> using namespace std; #define K 500000 int a[K+1], k; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif set<int> my; for(int i = 1; i <= K; ++i) { a[i] = a[i-1] - i; if(a[i] <= 0 || a[i] > 0 && my.find(a[i]) != my.end()) a[i] = a[i-1] + i; my.insert(a[i]); } while(scanf("%d", &k) != EOF && k != -1) printf("%d\n", a[k]); return 0; }
Code mẫu của ladpro98
program mrecaman; uses math; const fi=''; var a:array[0..500000] of longint; b:array[0..10000000] of boolean; c:array[0..100] of longint; inp:text; n,t,len,ii:longint; done:boolean; procedure open; begin assign(inp,fi); reset(inp); end; procedure process(t:longint); var i:longint; begin if t<=n then begin if ii<len then writeln(a[t]) else write(a[t]); exit; end; for i:=n+1 to t do begin a[i]:=a[i-1]-i; if (a[i]<=0) or (b[a[i]]) then a[i]:=a[i]+i+i; b[a[i]]:=true; done:=false; end; n:=t; if ii<len then writeln(a[t]) else write(a[t]); end; procedure input; begin len:=1; while c[len-1]<>-1 do begin readln(inp,c[len]); inc(len); end; dec(len,2); end; begin open; input; n:=0; a[n]:=0; b[0]:=true; ii:=1; while c[ii]<>-1 do begin process(c[ii]); inc(ii); end; close(inp); end.
Code mẫu của RR
type list=^node; node=record u:longint; next:list; end; procedure add(u:longint; var a:list); var p:list; begin new(p); p^.u:=u; p^.next:=a; a:=p; end; const hashkey=1000003; var h:array[0..hashkey] of list; a:array[0..500111] of longint; tmp,i:longint; function find(u:longint):boolean; var p:list; begin p:=h[u mod hashkey]; while p<>nil do begin if p^.u=u then exit(true); p:=p^.next; end; exit(false); end; procedure insert(u:longint); var p:list; begin p:=h[u mod hashkey]; while p<>nil do begin if p^.u=u then exit; p:=p^.next; end; add(u,h[u mod hashkey]); end; begin a[0]:=0; for i:=1 to 500000 do begin tmp:=a[i-1]-i; if (tmp>0) and (not find(tmp)) then a[i]:=tmp else a[i]:=a[i-1]+i; insert(a[i]); end; read(i); while (i>=0) do begin writeln(a[i]); read(i); end; end.
Code mẫu của hieult
#include <stdio.h> //#include <conio.h> #define max 500000 main() { int a[max+1], f[max*10],n; for(int i=1;i<=max*10-1;i++) f[i]=0; a[0]=0; for(int i=1;i<=max;i++) { if(a[i-1]-i>0&&f[a[i-1]-i]==0) a[i]=a[i-1]-i; else a[i]=a[i-1]+i; f[a[i]]=1; } while(scanf("%d",&n)>0&&n>=0) printf("%d\n",a[n]); // getch(); }
Code mẫu của ll931110
{$MODE DELPHI} Program MRECAMAN; Var check: array[-10000000..10000000] of boolean; a: array[0..5000000] of longint; k: longint; Procedure solve; Var m: longint; Begin Fillchar(check, sizeof(check), true); check[0]:= false; a[0]:= 0; For m:= 1 to 500000 do Begin a[m]:= a[m - 1] - m; If (a[m] <= 0) or not check[a[m]] then a[m]:= a[m - 1] + m; check[a[m]]:= false; End; End; Begin solve; Repeat Readln(k); If k <> -1 then writeln(a[k]); Until k = -1; End.
Code mẫu của khuc_tuan
// {$APPTYPE CONSOLE} {$mode delphi} type Hash = class x : integer; n : Hash; end; var table : array[0..1000000] of Hash; procedure add(x : integer); var q : Hash; begin q := Hash.Create; q.x := x; q.n := table[x mod 999997]; table[x mod 999997] := q; end; function exist(x : integer) : boolean; var q : Hash; begin q := table[x mod 999997]; while q<>nil do begin if q.x=x then begin exist := true; exit; end; q := q.n; end; exist := false; end; var a : array[0..500000] of integer; x, i : integer; begin a[0] := 0; add(0); for i:=1 to 500000 do begin a[i] := a[i-1] - i; if (a[i] < 0) or exist(a[i]) then a[i] := a[i-1] + i; add(a[i]); end; while true do begin read(x); if x=-1 then break; writeln(a[x]); end; end.
Bình luận