Cod sursa(job #168240)

Utilizator kolapsysPostelnicu Dan Marian kolapsys Data 30 martie 2008 21:52:57
Problema Dezastru Scor 20
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.89 kb
type stiva=array[1..25] of integer;
var as,ev:boolean;
    st:stiva;
    k,n,m,i,nr:integer;
    f,g:text;
    suma:real;
    a:array[1..25] of real;
function fact(n:integer):longint;
var i:integer;
    p:longint;
begin
   p:=1;
   for i:=2 to n do
       p:=p*i;
   fact:=p;
end;
procedure init(k:integer; var st:stiva);
begin
        st[k]:=0;
end;
procedure succesor(k:integer; var st:stiva; var as:boolean);
begin
        if st[k]<n then begin
                        as:=true;
                        st[k]:=st[k]+1;
                        end
                   else as:=false;
end;
procedure valid(k:integer; st:stiva; var ev:boolean);
var i:integer;
begin
        ev:=true;
        for i:=1 to k-1 do
            if st[i]=st[k] then ev:=false;
        if k>1 then if st[k-1]>st[k] then ev:=false;
end;
function sol(k:integer):boolean;
begin
        sol:=(k=m);
end;
procedure prod;
var i:integer;
    p:real;
begin
        p:=1;
        for i:=1 to k do
                p:=p*a[st[i]];
        suma:=suma+p;
end;
BEGIN
        assign(f,'dezastru.in'); reset(f);
        assign(g,'dezastru.out'); rewrite(g);
        readln(f,n,m);
        for i:=1 to n do
            read(f,a[i]);
        suma:=0;
        k:=1;
        init(k,st);
        while k>0 do
                begin
                repeat
                        succesor(k,st,as);
                        if as then valid(k,st,ev);
                until not(as) or (as and ev);
                if as then if sol(k) then prod
                                     else begin
                                          k:=k+1;
                                          init(k,st);
                                          end
                      else k:=k-1;
                end;
        nr:=fact(n) div fact(n-m) div fact(m);
        writeln(g,suma/nr:0:6);
        close(f); close(g);
END.