因为
注意需要特判概率不为
#include <cstdio>
const int MAXN=22;
const int MAXS=1100000;
double p[MAXN], f[MAXS], ans[MAXN];
int main()
{
// freopen("C.in", "r", stdin);
// freopen("C.out", "w", stdout);
int n, k, cnt=0;
scanf("%d%d", &n, &k);
for (int i=0; i<n; i++)
{
scanf("%lf", &p[i]);
if (p[i]>0) cnt++;
}
if (cnt<=k)
{
for (int i=0; i<n; i++) printf("%d ", p[i]>0);
putchar('\n');
return 0;
}
f[0]=1;
for (int s=0; s<1<<n; s++)
{
if (__builtin_popcount(s)==k)
for (int i=0; i<n; i++)
if (s&1<<i) ans[i]+=f[s];
double tmp=0;
for (int i=0; i<n; i++)
if (~s&1<<i) tmp+=p[i];
tmp=f[s]/tmp;
for (int i=0; i<n; i++)
if (~s&1<<i) f[s|1<<i]+=tmp*p[i];
}
for (int i=0; i<n; i++) printf("%.7lf ", ans[i]);
putchar('\n');
return 0;
}