[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卷积,然后再累加即可

 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 } 
View Code
原文地址:https://www.cnblogs.com/PYWBKTDA/p/12382100.html