Listing: AXA.PAS {$M 65000,0,655360} program axa; const fin='axa.in'; fout='axa.out'; type sir=array[0..20000] of Integer; var a:array[1..20000] of Integer; i,n,maxim,nr:Longint; sol:array[0..20000] of Boolean; pus:^sir; procedure citire; var x:Integer; f:Text; begin New(pus); Fillchar(a,Sizeof(a),0); Assign(f,fin); Reset(f); while not(Seekeof(f)) do begin Read(f,x); Inc(nr); Inc(a[x]) end; n:=1; while n*(n-1)<>nr*2 do Inc(n) end; procedure tiparire; var f:Text; i:Integer; begin Assign(f,fout); Rewrite(f); for i:=0 to maxim do if sol[i] then Writeln(f,i); Close(f); Halt end; procedure cautare(max,pz:Integer); var i,j:Integer; m:Boolean; begin while a[max]=0 do Dec(max); if pz=n then tiparire; if not(sol[max]) then begin m:=true; for i:=0 to pz-1 do if a[Abs(max-pus^[i])]>0 then Dec(a[Abs(max-pus^[i])]) else begin m:=false; Break end; if m and (i=pz-1) then begin pus^[pz]:=max; sol[max]:=true; cautare(max,pz+1); sol[max]:=false; Inc(i) end; for j:=0 to i-1 do Inc(a[Abs(max-pus^[j])]) end; max:=maxim-max; if not(sol[max]) then begin m:=true; for i:=0 to pz-1 do if a[Abs(max-pus^[i])]>0 then Dec(a[Abs(max-pus^[i])]) else begin m:=false; Break end; if (m and (i=pz-1)) then begin pus^[pz]:=max; sol[max]:=true; cautare(maxim-max,pz+1); sol[max]:=false; Inc(i) end; for j:=0 to i-1 do Inc(a[Abs(max-pus^[j])]) end end; Begin citire; for i:=1 to 20000 do if a[i]<>0 then maxim:=i; Fillchar(sol,Sizeof(sol),false); sol[0]:=true; sol[maxim]:=true; Dec(a[maxim]); pus^[0]:=0; pus^[1]:=maxim; cautare(maxim,2) End. [cuprins] |