P3175 [HAOI2015] 按位或 题解 / Min - Max 容斥 离散随机变量的几何分布
题目传送门:P3175 [HAOI2015] 按位或。
若 \(P(X=k)=p(1-p)^{k-1}\) 且 \(X\) 为离散型随机变量,只取正整数,那么 \(x\) 服从几何分布,则 \(E(X)=\sum\limits_{i=1}^{+\infty} P(X=i) =\frac{1}{p}\)。
设 \(E(\max\{S\})\) 表示 \(S\) 中最晚出现元素的时间的期望,\(E(\min\{s\})\) 表示 \(S\) 中最早出现的时间期望。
有 min-max 容斥得
\[E(\max\{S\}) = \sum_{T\subseteq S} (-1)^{|T|+1} E(\min\{T\})
\]
相当于转化求 \(E(\min\{S\})\),设 \(P(\min\{s\}=i)\) 表示恰好在第 \(i\) 秒出现元素的概率,即 \((\sum\limits_{T\cap S = \varnothing} P_T)^{i-1} (1-\sum\limits_{T\cap S = \varnothing} P_T)\)。
令 \(p=1-\sum\limits_{T\cap S = \varnothing} P_T\) 则 \(P(\min\{s\}=i) = p(1-p)^{k-1}\),由上面可得 \(E(\min\{S\})=\frac{1}{p}=\frac{1}{1-\sum\limits_{T\cap S = \varnothing} P_T}\)。
而 \(\sum\limits_{T\cap S = \varnothing} P_T = \sum\limits_{T\subseteq \complement_US} P_T\)。
相当于就是要计算每个子集的子集和,直接高维前缀和即可。
注意如果除 \(0\) 那么无解。
#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const int N=1<<20;
const double eps=1e-6;
inline int read(){
char c=getchar();
int f=1,ans=0;
while(c<48||c>57) f=(c==45?f=-1:1),c=getchar();
while(c>=48&&c<=57) ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();
return ans*f;
}
int n;
double a[N],p[N];
inline int get(int x){int ans=0;while(x) ans++,x&=x-1;return ans;}
main(){
n=read();
for (int i=0;i<(1<<n);i++) cin>>a[i],p[i]=a[i];
for (int i=1;i<=n;i++) for (int j=0;j<(1<<n);j++) if ((j>>i-1)&1) p[j]+=p[j^(1<<i-1)];
double ans=0;
for (int i=1;i<(1<<n);i++){
if (1.0-p[(1<<n)-1-i]<eps) return 0&puts("INF");
double tmp=1.0/(1.0-p[(1<<n)-1-i]);
if (get(i)&1) ans+=tmp;
else ans-=tmp;
}
printf("%.10Lf",ans);
return 0;
}

浙公网安备 33010602011771号