Cod sursa(job #1519456)

Utilizator ili226Vlad Ilie ili226 Data 7 noiembrie 2015 12:53:21
Problema Radix Sort Scor 30
Compilator fpc Status done
Runda Arhiva educationala Marime 1.4 kb
type nd=^nod;
     nod=record
          val,uc:longint;
          next:nd
         end;
     coada=record
            inc,sf:nd;
            nr:longint
           end;
     buckets=array[0..9]of coada;
var bk:array[0..1]of buckets;
    f:text;
    n,a,b,c,x,i,k:longint;
    p:nd;
procedure adauga(unde,ce,cifra:longint);
var p:nd;
begin
new(p);
p^.val:=ce;
p^.uc:=cifra div 10;
p^.next:=nil;
inc(bk[unde][cifra mod 10].nr);
if bk[unde][cifra mod 10].sf<>nil then
 bk[unde][cifra mod 10].sf^.next:=p;
bk[unde][cifra mod 10].sf:=p;
if bk[unde][cifra mod 10].inc=nil then
 bk[unde][cifra mod 10].inc:=p
end;
procedure muta(unde:longint);
var j:byte;
    p,pp:nd;
begin
 for j:=0 to 9 do
  begin
   p:=bk[unde][j].inc;bk[unde][j].nr:=0;
   bk[unde][j].inc:=nil;
   bk[unde][j].sf:=nil;
   while p<>nil do
    begin
     adauga((unde+1)mod 2,p^.val,p^.uc);
     pp:=p;
     p:=p^.next;
     freemem(pp,sizeof(nod));
    end;
  end;
end;

begin
assign(f,'radixsort.in');
reset(f);
readln(f,n,a,b,c);
close(f);
for i:=1 to n do
 begin
  if i=1 then x:=b
         else x:=(x*a+b)mod c;
  adauga(0,x,x)
 end;
k:=1;
repeat
inc(k);k:=k mod 2;
muta(k);
until bk[(k+1)mod 2][0].nr>=n;
p:=bk[(k+1)mod 2][0].inc;
i:=0;
assign(f,'radixsort.out');
rewrite(f);
while p<>nil do
 begin
  inc(i);
  if i mod 10 = 1 then
   write(f,p^.val,' ');
  p:=p^.next;
 end;
close(f);
end.