Pagini recente » Istoria paginii runda/pregatire.banal/clasament | Calibrare limite de timp | Cod sursa (job #940128) | Cod sursa (job #2372292) | Cod sursa (job #1283004)
#include <cstdio>
using namespace std;
int st[26],n,k,p;
float s,b[26];
void abc()
{
float w=1;
for(int i=1;i<=k;i++)w*=b[st[i]];
s+=(2.0*w)/float(p);
}
void back(int x)
{
for(int i=st[x-1]+1;i<=n;i++)
{
st[x]=i;
if(x==k)abc();
else back(x+1);
}
}
unsigned long long comb(int n,int k)
{
unsigned long long n2,nf,ns,j;
n2=n-k;
nf=ns=1;
if(n==k)
return 1;
else
{
if(n2>=k)
{
for(j=n2+1;j<=n;j++)
nf=nf*j;
for(j=2;j<=k;j++)
ns=ns*j;
return (nf/ns)%30103;
}
else
{
for(j=k+1;j<=n;j++)
nf=nf*j;
for(j=2;j<=n2;j++)
ns=ns*j;
return (nf/ns)%30103;
}
}
}
int main()
{
freopen("dezastru.in","r",stdin);
freopen("dezastru.out","w",stdout);
scanf("%d%d",&n,&k);
p=2*1LL*comb(n,k);
for(int i=1;i<=n;i++)scanf("%f",&b[i]);
back(1);
printf("%.6f",s);
return 0;
}