Cod sursa(job #361678)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 6 noiembrie 2009 11:39:39
Problema Dezastru Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#include <math.h>
#define Nmax 26

float a[Nmax][Nmax],v[Nmax],cnk;
int n,k,i,j;
int e[Nmax];

void make_cnk(int l,int r,int semn){
	int i,d;
   for(i=l;i<=r;++i){
   	while( i % 2 == 0) e[2]+=semn, i /=2;
      for(d=3; d<=sqrt(i); d+=2)
   		while( i % d == 0) e[d]+=semn, i /=d;
      if(i>1) e[i]+=semn;
   }
}

int main(){
	freopen("dezastru.in","r",stdin);
   freopen("dezastru.out","w",stdout);
   scanf("%d%d",&n,&k);
   for(i=1;i<=n;++i) scanf("%f",&v[i]);

   for(i=0;i<=n;++i) a[i][0]=1;
   for(i=1; i<=n; ++i)
     for(j=1; j<=i; ++j)
     	a[i][j] = a[i-1][j] + a[i-1][j-1] * v[i];

   make_cnk(k+1,n,1);
   make_cnk(1,n-k,-1);

   for(cnk=1,i=2;i<=n;++i)
   	while(e[i]) cnk *= i, e[i]--;

   printf("%.6f\n",a[n][k]/cnk);
   fclose(stdin); fclose(stdout);
   return 0;
}