Cod sursa(job #39531)

Utilizator Bluedrop_demonPandia Gheorghe Bluedrop_demon Data 26 martie 2007 20:03:31
Problema Dezastru Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.94 kb
{
    Problema dezastru
}

Program dezastru;

Type ref = ^elm;
     elm = record
            x : byte;
            adr : ref;
           end;

Var pp, fac, prod : real;
    n, k, i, j : Byte;
    nr : Longint;
    v : array[1..25] of Real;
    p, pu, u, e : ref;
    cod1 : boolean;

Begin
    Assign( input, 'dezastru.in' );
    Reset( input );
        Readln( n, k );
        For i := 1 to n do
            Read( v[i] );
    Close( input );

    fac := 1;
    For i := 2 to k do
        fac := fac * i;

    pp := 0;
    j := 1;
    new( p );
    p^.x := 0;
    p^.adr := nil;
    u := p;
    pu := nil;
    nr := 0;
    Repeat
        Repeat
            cod1 := false;
            if ( u <> nil ) and ( u^.x < n-k+j ) then
                Begin
                    u^.x := u^.x + 1;
                    cod1 := true;
                End;
        Until ( ( cod1 ) and ( j <= n ) ) or ( not cod1 );
        If cod1 then
            if j = k then
                Begin
                    nr := nr+1;
                    prod := 1;
                    e := p;
                    While e <> nil do
                        Begin
                            prod := prod*v[e^.x];
                            e := e^.adr;
                        End;
                    pp := pp + fac*prod;
                End
                else
                Begin
                    j := j+1;
                    new( e );
                    pu := u;
                    e^.x := u^.x;
                    e^.adr := nil;
                    u^.adr := e;
                    u := e;
                End
            else
            Begin
                e := u;
                u := pu;
                dispose( e );
                j := j-1;
            End;
    Until j <= 0;

    pp := pp/(nr*fac);

    Assign( output, 'dezastru.out' );
    Rewrite( output );
        Writeln( pp:0:6 );
    Close( output );
End.