zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    十二周作业
    十一周作业
    第十周作业
    第九周作业
    第八周作业
    第七周作业
    2019年第六周作业
    第五周作业总结
    介绍自己
    第一学期总结
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/12382100.html
Copyright © 2011-2022 走看看