Cod sursa(job #863868)

Utilizator Catah15Catalin Haidau Catah15 Data 24 ianuarie 2013 11:19:25
Problema Dezastru Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

#define maxN 30

int N, K;
int x[maxN];
double P[maxN], ans;
double PFact = 1, NFact = 1;


void sol ()
{
	double p = 1;
	
	for (int i = 1; i <= N; ++ i)
	{
		if (! x[i]) continue;
		p *= P[i];
	}
	
	ans += PFact * p;
}


void back (int p, int S)
{
	for (int i = 0; i <= 1; ++ i)
	{
		x[p] = i;
		
		if (S + i <= K && p <= N)
			if (S + i == K && p == N) sol ();
			else back (p + 1, S + i);
	}
}


int main()
{
	freopen ("dezastru.in", "r", stdin);
	freopen ("dezastru.out", "w", stdout);
	
	scanf ("%d %d", &N, &K);
	
	for (int i = 1; i <= N; ++ i) scanf ("%lf", &P[i]);
	for (int i = 1; i <= K; ++ i) PFact *= i;
	for (int i = 1; i <= N; ++ i) NFact *= i;
	
	back (1, 0);
	
	printf ("%.7lf", ans / NFact);
	
	return 0;
}