Cod sursa(job #304822)

Utilizator FllorynMitu Florin Danut Flloryn Data 15 aprilie 2009 13:56:57
Problema Economie Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.41 kb
program pascal;
var f,g:text;    t:array[1..50000] of byte; x,p:array[0..1000] of longint;
                 max,i,k,j,n,aux,c:longint;
  procedure citire;
  begin
  assign(f,'economie.in'); reset(f);
  assign(g,'economie.out'); rewrite(g);
  readln(f,n);
  max:=0;
  for i:=1 to n do
    begin
    readln(f,x[i]);
    if x[i]>max then max:=x[i];
    end;
  for i:=1 to max do t[i]:=1;
  close(f);
  end;

  procedure sort(s,d:longint);
  var a,b,aux,ia:longint;
  begin
    a:=s; b:=d;
    repeat
    while x[a]<x[b] do b:=b-1;
    aux:=x[a]; x[a]:=x[b]; x[b]:=aux; ia:=1; a:=a+1;
    if a<b then
            begin
            while x[a]<x[b] do a:=a+1;
            if a<>b then
             begin
             aux:=x[a]; x[a]:=x[b]; x[b]:=aux; ia:=0; b:=b-1;
             end;
            end;
    until b<=a;
    if a-ia>s then sort(s,a-ia);
    if a-ia+1<d then sort(a-ia+1,d);
  end;

  procedure sorte;
  begin
  k:=0;
  for j:=1 to n do
  if  t[x[j]]=1 then
       begin
       k:=k+1; p[k]:=x[j];
       for i:=1 to max do
       if (i mod p[k]=0) then t[i]:=0
           else
             begin
             c:=i+p[k];
             if (t[i]=0) and (c<=max) then t[c]:=0;
             end;
       end;
  end;

  procedure afisare;
  begin
  writeln(g,k);
  for i:=1 to k do writeln(g,p[i]);
  close(g);
  end;

begin
citire;
sort(1,n);
sorte;
afisare;
exit;
end.