bzoj4036 [HAOI2015]按位或
题解
考虑 $min-max$ 容斥
设 $E(max/min\{s\})$ 表示 $s$ 集合中最晚/最早出现的元素的时间的期望
则 $E(max\{s\})=\sum_{t⊆s}(-1)^{|T|-1}E(min\{t\})$
求 $E(min{t})$ 比较容易,就是 $\frac{1}{\sum_{x∩t \ne ϕ}p_x}$
考虑分母怎么求,那我们可以用 $1$ 减去和 $t$ 没有交集的集合的概率和,也就是 $t$ 的补集的子集,那就可以用 $fwt_{or}$ 来求
效率: $O(n2^n)$
代码
#include <bits/stdc++.h> using namespace std; int n,t,a[1<<20]; double p[1<<20],s; int main(){ cin>>n;t=(1<<n); for (int i=0;i<t;i++) scanf("%lf",&p[i]), a[i]=a[i>>1]+(i&1); for (int i=1;i<t;i<<=1) for (int j=0;j<t;j+=(i<<1)) for (int k=0;k<i;k++) p[i+j+k]+=p[j+k]; for (int i=1;i<t;i++) if (1-p[(t-1)^i]>1e-10) s+=((a[i]&1)?1.:-1.)/(1-p[(t-1)^i]); if (s<1e-10) puts("INF"); else printf("%.10lf\n",s); return 0; }