[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

 

posted @ 2020-02-29 11:44  PYWBKTDA  阅读(142)  评论(0编辑  收藏  举报