[bzoj4036]按位或
首先可以将期望转换为$\sum_{i=0}^{inf}P(i)$,其中P(i)表示i轮后还没有结束的概率,通过对i轮后的结果容斥,可以得到$P(i)=\sum_{j=0}^{2^{n}-2}(\sum_{k|j=j}p_{k})^{i}*(-1)^{n-|j|-1}$
对i累加后,发现即$\sum_{j=0}^{2^{n}-2}(-1)^{n-|j|-1}\sum_{i=0}^{inf}(\sum_{k|j=j}p_{k})^{i}=\sum_{j=0}^{2^{n}-2}(-1)^{n-|j|-1}*\frac{1}{1-\sum_{k|j=j}p_{k}}$
$\sum_{k|j=j}p_{k}$这个相当于一个n维的前缀和,即FWT的or卷积,然后再累加即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 2000005 4 int n,m,cnt[N]; 5 double ans,p[N]; 6 int main(){ 7 scanf("%d",&n); 8 m=(1<<n); 9 for(int i=0;i<m;i++)scanf("%lf",&p[i]); 10 for(int i=0;i<n;i++) 11 for(int j=0;j<m;j++) 12 if (j&(1<<i))p[j]+=p[j-(1<<i)]; 13 cnt[0]=(n&1); 14 for(int i=1;i<m;i++)cnt[i]=cnt[i>>1]^(i&1); 15 for(int i=0;i<m-1;i++) 16 if (1-p[i]>1e-8)ans+=(2*cnt[i]-1.0)/(1-p[i]); 17 if (ans<1e-10)printf("INF"); 18 else printf("%.6f",ans); 19 }