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;
}
posted @ 2026-01-27 11:52  OTn53_qwq  阅读(15)  评论(0)    收藏  举报