例题
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/ec391541ba4494e8b69080fe5595f223" alt="" />
<img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/fdee01ea2ce5feca2de51a7e4d5cf587" alt="" /></p>
<pre><code class="language-cpp">#include <bits/stdc++.h>
using namespace std;
const double eps=1e-9;
const int N=21,LIM=(1<<20)+10;
int n,lim;
double p[LIM],g[LIM];
int main() {
scanf("%d",&n); lim=(1<<n)-1;
for(int i=0;i<=lim;i++) {
scanf("%lf",&p[i]);
if(p[i]+eps>1.0){
(i==lim)?puts("1.00000000"):puts("INF");
return 0;
}
}
for(int i=1;i<=lim;i<<=1)
for(int j=0;j<=lim;j++)
if(j&i) p[j]=p[j]+p[j^i];
for(int i=0;i<=lim;i++)
g[i]= (p[i]+eps>1.0) ?0 :-1.0/(1.0-p[i]);
for(int i=1;i<=lim;i<<=1)
for(int j=0;j<=lim;j++)
if(j&i) g[j]=g[j]-g[j^i];
if(g[lim]<eps) {puts("INF"); return 0;}
printf("%.10f",g[lim]);
}</code></pre>