题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036
题解:https://www.cnblogs.com/Zinn/p/10260126.html
#include<cstdio>
#include<cstring>
#include<algorithm>
#define db double
using namespace std;
const int N=,M=(<<)+;
int n,bin[N],lm,ct[M];
db ans,mn[M],p[M];bool vis[N];
void fmt(db *a)
{
for(int i=;i<lm;i<<=)
for(int s=;s<lm;s++)
if(s&i)p[s]+=p[s^i];
}
int main()
{
scanf("%d",&n);
bin[]=;for(int i=;i<=n;i++)bin[i]=bin[i-]<<; lm=bin[n];
for(int s=;s<lm;s++)
{
scanf("%lf",&p[s]); if(!p[s])continue;
for(int i=;i<n;i++)if(s&bin[i])vis[i]=;
}
for(int i=;i<n;i++)if(!vis[i]){puts("INF");return ;}
fmt(p);
for(int s=,u=lm-;s<lm;s++)mn[s]=/(-p[u^s]);//s=1//only p[u]=1 for legal
for(int s=;s<lm;s++)ct[s]=ct[s-(s&-s)]+;
for(int s=;s<lm;s++)//s=1
(ct[s]&)?ans+=mn[s]:ans-=mn[s];
printf("%.10f\n",ans);
return ;
}