Cod sursa(job #434292)

Utilizator Smaug-Andrei C. Smaug- Data 5 aprilie 2010 16:24:26
Problema Dezastru Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>

int factorial(int number){

  int result = 1;
  while(number > 0)
    result *= number--;

  return result;
}

int main(){

  freopen("dezastru.in", "r", stdin);
  freopen("dezastru.out", "w", stdout);

  int jump[40];
  double prob[40], chance, temp;
  int N, K, i, j, step, divider;

  scanf("%d %d", &N, &K);
  for(i = 1; i <= N; i++)
    scanf("%lf", prob+i);

  divider = factorial(N)/(factorial(K)*factorial(N-K));

  for(i = 1; i <= K; i++)
    jump[i] = i;

  chance = 0;
  
  while(true){
    
    temp = 1;
    for(i = 1; i <= K; i++)
      temp *= prob[jump[i]];
    chance += temp;

    if(jump[K] < N)
      jump[K]++;
    else {
      for(i = K-1; i > 0; i--)
	if(jump[i]+1 != jump[i+1]){
	  jump[i]++;
	  step = 1;
	  for(j = i+1; j <= K; j++){
	    jump[j] = jump[i]+step;
	    step++;
	  }
	  break;
	}

      if(i == 0)
	break;
    }
  }

  printf("%lf\n", chance/divider);
    
  return 0;   
}