Cod sursa(job #394062)

Utilizator HoriaClementHoriaC HoriaClement Data 10 februarie 2010 14:19:55
Problema Dezastru Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <stdio.h>

int sol[16],k,n;
long long cnt;
double v[26],sg,sum;
bool marcat[26];

long long fact(int y,int x)
{
	long long a=1;
	for(int i=y+1;i<=x;++i)
		a*=i;
	return a;
}

void edit()
{
	double pg=1;
	for(int i=1;i<=k;++i)
		pg*=v[sol[i]];
	cnt++;
	sg += pg;
	//printf("%lf sg=%lf\n",pg,sg);
}
void edit2()
{
	double pg=1;
	for(int i=1;i<=n;++i)
		if(!marcat[i])
			pg*=v[sol[i]];
	cnt++;
	sg += pg;
	//printf("%lf sg=%lf\n",pg,sg);
}
void bkt(int p)
{
	if (p==k+1)
	{
		edit();
		return;
	}
	for (int i=sol[p-1]+1;i<=n;++i)
	{
		sol[p]=i;
		bkt(p+1);
	}
}
void bkt2(int p)
{
	if (p==n-k+1)
	{
		edit2();
		return;
	}
	for (int i=sol[p-1]+1;i<=n;++i)
	{
		sol[p]=i;
		marcat[i]=true;
		bkt(p+1);
		marcat[i]=false;
	}
}
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",&v[i]);
	if(k<=n/2)
		bkt(1);
	else
		bkt2(1);
	sum=sg/cnt;
	printf("%lf",sum);
	return 0;
}