Pagini recente » Cod sursa (job #1206586) | Cod sursa (job #706895) | Cod sursa (job #2063371) | Cod sursa (job #2938733) | Cod sursa (job #158684)
Cod sursa(job #158684)
#include<stdio.h>
#define INPUT "dezastru.in"
#define OUTPUT "dezastru.out"
#define NMax 26
FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");
int st[ NMax ], k, n, m, LMax;
long double a[ NMax ];
long double PMax, Total;
void readValues();
inline void init();
inline int succesor();
inline int valid(){return 1;}
inline int solutie();
void printSolution();
int main()
{
int l, as, ev;
PMax = 1;
readValues();
if( m < n / 2)
LMax = m;
else
LMax = n - m;
k = 1;
while(k)
{
l = 1;
do
{
as = succesor();
if( as ) ev = valid();
if( (as && ev) || !as)
l = 0;
} while(l);
if(as)
{
if(solutie()){}
else
{
++k;
init();
}
}
else
--k;
}
printSolution();
fclose(fin);
fclose(fout);
return 0;
}
void readValues()
{
fscanf(fin, "%d %d", &n, &m);
for(int i = 1; i <= n; ++i)
{
fscanf(fin, "%Lf", &a[ i ]);
PMax *= (long double)a[ i ];
}
}
inline void init()
{
st[ k ] = st[ k - 1 ];
}
inline int succesor()
{
if( st[ k ] < n)
{
++st[ k ];
return 1;
}
return 0;
}
inline int solutie()
{
long double PNou = 1;
if( k == LMax )
{
for( int i = 1; i <= k; ++i)
PNou *= a[ st[ i ] ];
if( k == m )
Total += (long double)PNou;
else
Total += ((long double)PMax / (long double)PNou);
return 1;
}
return 0;
}
void printSolution()
{
long prod = 1;
for( int i = 1; i <= n; ++i)
prod *= i;
Total *= 2;
fprintf(fout, "%.6Lf\n", (long double)Total/(long double)prod);
}