Cod sursa(job #1450964)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 15 iunie 2015 15:15:57
Problema Dezastru Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
/*
    If you can't explain it simply, you don't understand it well enough.
*/

#include <cstdio>

using namespace std;

const int Nmax = 30;

int n, k , i , x;

double sum;
double p[Nmax];

void verif()
{
    double probability = 1.0;
    
    for (int i = 1; i <= n; ++i)
        if ((x >> i) & 1)
            probability *= p[i];
    
    sum += probability;
}

void generare(int niv , int ind)
{
    if (niv == k + 1)
        verif();
    else
    {
        if (n - ind < k - niv + 1)
            return;
        
        for (int i = ind + 1; i <= n; ++i)
        {
            x ^= (1 << i);
            generare(niv + 1 , i);
            x ^= (1 << i);
        }
    }
}

int main()
{
    freopen("dezastru.in","r",stdin);
    freopen("dezastru.out","w",stdout);
    
    scanf("%d %d", &n, &k);
    
    for (i = 1; i <= n; ++i)
        scanf("%lf", &p[i]);
    
    generare(1 , 0);
    
    for (i = k + 1; i <= n; ++i)
        sum /= (1.0 * i);
    
    printf("%.6lf", sum);
    
    return 0;
}