Cod sursa(job #214706)

Utilizator FllorynMitu Florin Danut Flloryn Data 15 octombrie 2008 18:21:52
Problema Economie Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.84 kb
program pascal;
var f,g:text;
    n,i,k,s,j,p:longint;
    v,t:array[1..1000] of longint;  ok:boolean;
    x:array[1..100000000] of longint;

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

begin
assign(f,'economie.in'); reset(f);
assign(g,'economie.out'); rewrite(g);

readln(f,n);
for i:=1 to n do  readln(f,v[i]);
quicksort(1,n);
k:=1;
t[1]:=v[1];
s:=t[1];
x[t[k]]:=1;

if t[1]=1 then
    begin
        writeln(g,1);
        write(g,1);
    end
     else
      begin
         for i:=2 to n do
         begin
             ok:=true;
             for j:=1 to s do
              if x[j]=1 then
              if v[i] mod j=0 then
                             begin
                               ok:=false;
                               break;
                             end;
             if ok then
              begin
                k:=k+1;
                t[k]:=v[i];
                for j:=1 to s do
                if x[j]=1 then
                 begin
                     x[j+v[i]]:=1;
                     if j+v[i]>s then s:=j+v[i];
                 end;
                x[v[i]]:=1;
              end;
           end;
          writeln(g,k);
          for p:=1 to k do writeln(g,t[p]);
        end;

close(f);
close(g);
end.