var a:array[1..100,1..100] of integer; rab:array[1..25,1..25] of integer; k,i,j,m,w,t:integer; procedure mag(p,o:integer); {Процедура, которая осуществляет } var {построение 1/4 части магического} k,i,j,l,m,r1,r2:integer; {квадрата, по правилу де Лялубера} begin for i:=1 to trunc(sqrt(o-p+1)) do for j:=1 to trunc(sqrt(o-p+1)) do rab[i,j]:=0; k:=trunc(sqrt(o-p+1)); rab[1,(k div 2)+1]:=p; l:=1; m:=(k div 2)+1; for i:=p+1 to o do begin inc(m); l:=l-1; while (l<1)or(m>k)or(rab[l,m]<>0) do begin r1:=l; r2:=m; if l<1 then l:=k; if m>k then m:=1; if rab[l,m]<>0 then begin l:=r1+2; m:=r2-1; end; end; rab[l,m]:=i; end; end; begin readln(k); mag(1,trunc(k*k/4)); for i:=1 to (k div 2) do for j:=1 to (k div 2) do a[i,j]:=rab[i,j]; mag(trunc(k*k/4)+1,trunc(k*k/2)); for i:=1 to (k div 2) do for j:=1 to (k div 2) do a[i+(k div 2),j+(k div 2)]:=rab[i,j]; mag(trunc(k*k/2)+1,trunc(3*k*k/4)); for i:=1 to (k div 2) do for j:=1 to (k div 2) do a[i,(k div 2)+j]:=rab[i,j]; mag(trunc(3*k*k/4)+1,trunc(k*k)); for i:=1 to (k div 2) do for j:=1 to (k div 2) do a[i+(k div 2),j]:=rab[i,j]; m:=trunc((k/2-1)/2); {Осуществление правил,} for i:=(k div 4)+1 downto ((k div 4)+2-m) do {используемых при по- } begin {строении магического } w:=a[(k div 4)+1,i]; {квадрата простой чет-} a[(k div 4)+1,i]:=a[trunc((k div 4)+1+k/2),i]; {ности } a[trunc((k div 4)+1+k/2),i]:=w; end; for i:=1 to trunc(k/2) do for j:=1 to m do if i<>k div 4+1 then begin w:=a[i,j]; a[i,j]:=a[trunc(i+k/2),j]; a[trunc(i+k/2),j]:=w; end; for t:=m-1 downto 1 do for i:=1 to k div 2 do begin w:=a[i,k-t+1]; a[i,k-t+1]:=a[trunc(i+k/2),k-t+1]; a[trunc(i+k/2),k-t+1]:=w; end; for i:=1 to k do {Печать полученного квадрата} begin for j:=1 to k do write(a[i,j]:5); writeln; end; readln; end.