program deratizace; var N, K : longint; {hodnoty ze zadání } kouzel : array [0..N-1] of longint; {počet kouzel potřebný k dosažení těchto stavů na konci dne} odkud : array [0..N-1] of longint; {jaký byl ideální včerejší počet, abychom se dostali sem } jakpak : array [0..N-1] of longint; {jak čarodějka změnila včera počet, abychom se dostali sem } skupiny : array [0..2,0..N-1] of longint; {skupiny počtů k prozkoumání ... } plnost : array [0..2] of longint; {... jejich plnost ... } vybirana: longint; {... a právě vybíraná skupina } procedure vloz(skupina,copak:longint); begin skupiny[skupina,plnost[skupina]]:=copak; inc(plnost[skupina]); end; procedure zkus_pridat(co,jak,nakouzel:longint); {Je tenhle tah zlepšení?} var zitra,deratu,skupina:longint; begin zitra:=(co*3+jak) mod N; {kolik jich bude zítra večer?} deratu:=(co*3+jak) div N; {kolik D-kouzel bude další den?} if kouzel[zitra]<=nakouzel+deratu then exit; kouzel[zitra]:=nakouzel+deratu; {ulož tento postup ...} odkud[zitra]:=co; jakpak[zitra]:=jak; vloz((vybirana+deratu) mod 3,zitra); {...a vlož ho do správné skupiny} end; var i,j:longint; begin read(N, K); for i:=0 to N-1 do kouzel[i]:=K+1; {zatím nedosažené stavy} vybirana:=0; for i:=-1 to +1 do begin j:=(K+i) mod N; kouzel[j]:=(K+i) div N; odkud[j]:=K; jakpak[j]:=i; vloz((vybirana+kouzel[j]) mod 3,j); end; while (plnost[0]+plnost[1]+plnost[2]>0) do begin if plnost[vybirana]=0 then vybirana:=(vybirana+1) mod 3; {cyklit skupiny} if plnost[vybirana]=0 then vybirana:=(vybirana+1) mod 3; {cyklit skupiny} i:=skupiny[vybirana,plnost[vybirana]-1]; {vybrat prvek} dec(plnost[vybirana]); if i=0 then {deratizováno!} begin writeln('Postup pozpatku:'); while (odkud[i]<>K) do begin j:=3*odkud[i]+jakpak[i]; writeln('rano ',3*odkud[i],', uprava ',jakpak[i],', deratizaci ',j div N,', vecer ',i); i:=odkud[i]; end; writeln('rano ',K,', uprava ',jakpak[i],', deratizaci ',(K+jakpak[i]) div N,', vecer ',i); exit; end; for j:=-1 to 1 do zkus_pridat(i,j,kouzel[i]); end; end.