传送门

分析

soj#532 set p3175_C

代码

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
double p[1<<20],Ans;
int n,m,N;
inline int sum(int x){
    int res=0;
    while(x){
      if(x&1)res++;
      x>>=1;
    }
    return res;
}
int main(){
    int i,j,k;
    scanf("%d",&n);
    N=1<<n;
    for(i=0;i<N;i++)scanf("%lf",&p[i]);
    for(i=1;i<N;i<<=1)
      for(j=0;j<N;j+=(i<<1))
        for(k=0;k<i;k++)
          p[i+j+k]+=p[j+k];
    for(i=1;i<N;i++)if(1-p[(N-1)^i]>eps)
      Ans+=((sum(i)&1)?1:-1)/(1-p[(N-1)^i]);
    if(Ans<1e-10)puts("INF");
      else printf("%0.6lf\n",Ans);
    return 0;
}