概率与期望

概率

条件概率:
	P(A|B)=P(A*B)/ P(B) 

乘法公式 
	P(AB)=P(A)*P(B|A)=P(B)*P(A|B)

全概率公式:若事件A1,A2,A3,…,An构成一组完备的事件(①两两对立②合起来构成样本空间S)且都有正概率,即∀i,j,Ai∩Aj=∅且∑Ai=1,则有P(B)=∑P(Ai)*P(B|Ai)

贝叶斯公式:P(Bi|A)=[P(Bi)*P(A|Bi)]/∑[P(Bj)*P(A|Bj)],其中事件B1,B2,B3,…,Bn构成一组完备的事件且都有正概率。

期望

随机变量是一个从样本空间S到实数集R的映射X,	
可以直观理解为:当随机实验E取结果A时,
该随机变量取值a,记作X(A)=a。此时的概率记作
P(X=a)。
以下用I(X)表示随机变量X的取值范围。即,如果把X	
看做一个映射,则I(X)是它的值域。我们称两个随机	
变量X,Y独立,当P((X=a)∩(Y=b))=P(X=a)*P(Y=b)。
类似的,多个随机变量也可能是独立的,此时这些
随机变量	中任选一些出来也是独立的,同样不能反
推。

一个随机变量被称为离散型随机变量,当它的值域	
大小有限或者为可列无穷大。离散型随机变量的期
望是其每个取值乘以该取值对应概率的总和,记为
E(X)=∑a*P(X=a)。
	
E(a*X)=a*E(X),这里a为常数。

推广1:E(a)=a。

推广2:E(∑ai*Xi)=∑ai*E(Xi)。

如果X和Y是两个独立的随机变量,那么	
E(X*Y)=E(X)*E(Y)。
证明:E(X)*E(Y)=(∑i*P(X=i))*	
(∑j*P(Y=j))=∑∑i*j*P(X=i)*P(Y=j)。因为X和Y是两个
独立的随机变量,所以P(X=i)*P(Y=j)=P(X=i∩Y=j),
所以E(X)*E(Y)=∑∑i*j*P(X=i∩Y=j)=E(X*Y)。

易错:(1)E(X2)≠E(X)2;(2)E(1/X)≠1/E(X);
(3)E(max(X,Y))≠max(E(X),E(Y))

方法总结

1.取并与取反:

cf_1461C_Random Events
在这里插入图片描述
首先我们处理出排列的无序性,即 找到原排列在pos位置前为无序,pos后为有序
然后所有 r i 超过 p o s 的都可以使原排列有序 然后所有r_i超过pos的都可以使原排列有序 然后所有ri超过pos的都可以使原排列有序
这里,我们原应对原排列取并,在容斥,但太麻烦。可以考虑求补集,减去补集就可;
正难则反呗

#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=2e5+7;
int T,n,m;
int a[N],pos;
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);pos=n;
		for(int i=1;i<=n;i++) 
			scanf("%d",&a[i]);
		for(int i=n;i;i--){
			pos=i;
			if(i!=a[i]) 	break;
		}
		db ans=1.0;
		while(m--){
			int r; db p;
			scanf("%d%lf",&r,&p);
			if(r>=pos) ans*=(1.0-p);
		}
		if(pos==1){
			printf("1.000000\n");
			continue;
		}
		printf("%.6lf\n",1.0-ans);
	}
}

CodeForces - 1525E -Assimilation IV

在这里插入图片描述
俗话说得好,和的期望对于期望的和
所以对于这道题就是先对单个光点求期望再加起来
考虑求单点的期望,
容易知道,
单点的期望 = 单点在所有排列中出现次数 排列数 单点的期望=\frac{单点在所有排列中出现次数}{排列数} 单点的期望=排列数单点在所有排列中出现次数
排列数 为 n!
单点在所有排列中出现次数 j就不好求了
但我们可以求单点不出现的次数,就方便许多了

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=5e4+5;
const ll mod=998244353;
int n,m;
ll ans,fac[N];
vector<int> pos[N];

ll qpow(ll ba,ll pow){
	ll res=1;
	while(pow){
		if(pow&1) res=res*ba%mod;
		ba=ba*ba%mod;
		pow>>=1;
	}
	return res;
}

void work(int k){
	sort(pos[k].begin(),pos[k].end());

	ll tmp=0,cnt=0;
	for(auto x:pos[k]){
		ll flag=x-1-cnt;
		if(flag<=0) {
			tmp=0;
			break;
		}
		tmp==0? tmp=flag: tmp*=flag;
		cnt++;
	}

	ans=(ans+(fac[n]-tmp)%mod+mod)%mod;
}

int main(){
	fac[0]=1;
	for(int i=1;i<=5001;i++) fac[i]=fac[i-1]*1ll*i%mod;

	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1,x;j<=m;j++){
			scanf("%d",&x);
			pos[j].pb(x);
		}
	}

	ll base=qpow(fac[n],mod-2);

	for(int i=1;i<=m;i++)
		work(i);
	
	printf("%lld\n",ans*base%mod);
}

2.线性概率DP

直接上DP式
f i , j = p i ∗ f i − 1 , j − 1 + ( 1 − p i ) ∗ f i − 1 , j f_{i,j}=p_i*f_{i-1,j-1} +(1-p_i)*f_{i-1,j} fi,j=pifi1,j1+(1pi)fi1,j
DP式很好理解
就是第i轮发生j次事件的概率

下边的题就会用到它,还是挺常用的
cf_54C_First Digit Law

3.贪心

cf_442B_Andrey and Problem

在这里插入图片描述
先考虑如何计算某个方案下恰好答对1道题的
概率。假设我们选了a[1],a[2],…,a[m]这m道题,那么恰好对一道题的概率等于∑ p a [ i ] ∗ ∏ ( 1 − p a [ j ] ) p_{a[i]}*\prod(1-p_{a[j]}) pa[i](1pa[j]),其中1<=i<=m,1<=j<=m且j≠i。整理后等于 ∏ ( 1 − p a [ i ] ) ∗ ∑ ( p a [ i ] / ( 1 − p a [ i ] ) ) \prod(1-p_{a[i]})*∑(p_{a[i]}/(1-p_{a[i]})) (1pa[i])(pa[i]/(1pa[i])),其中两个i都是1<=i<=m。

假定所有的 p i < 1 ,否则选一道 p i = 1 的题即可。设 P = ∏ ( 1 − p a [ i ] ) , S = ∑ ( p a [ i ] / ( 1 − p a [ i ] ) ) ,考虑第 m + 1 道题选择 x ,那么恰好对一道题的概率的变化量 δ = P ∗ ( 1 − p x ) ∗ ( S + p x / ( 1 − p x ) ) − P S = P S + P p x / ( 1 − p x ) − P S p x − P p x 2 / ( 1 − p x ) − P S = P p x / ( 1 − p x ) − P S p x − P p x 2 / ( 1 − p x ) = P p x ∗ ( 1 / ( 1 − p x ) − S − p x / ( 1 − p x ) ) = P p x ∗ ( 1 − S ) 。也就是说, δ 的符号其实与 p x 的大小无关,只和 1 − S 的符号有关。当 S < 1 时,我们比较第 m 道题选 x 还是选 y , P ∗ ( 1 − p x ) ∗ ( S + p x / ( 1 − p x ) ) − P ∗ ( 1 − p y ) ∗ ( S + p y / ( 1 − p y ) ) = P ∗ [ ( 1 − p x ) ∗ ( S + p x / ( 1 − p x ) ) − ( 1 − p y ) ∗ ( S + p y / ( 1 − p y ) ) ] = P ∗ [ S ∗ ( ( 1 − p x ) − ( 1 − p y ) ) + p x − p y ] = P ∗ [ S ∗ ( p y − p x ) + p x − p y ] = P ∗ ( p x − p y ) ∗ ( 1 − S ) ,因为 S < 1 所以当 p x > p y 时,选 p x 能让恰好对一道题的概率更大,也就是说当多选一题能让方案更优时,最优选择就是 p i 最大的那道题,所以最优方案是 p i 最大的一些题,贪心选即可。 假定所有的p_i<1,否则选一道p_i=1的题即可。设P=∏(1-p_{a[i]}),S=∑(p_{a[i]}/(1-p_{a[i]})),考虑第m+1道题选择x,那么恰好对一道题的概率的变化量δ=P*(1-p_x)*(S+p_x/(1-p_x))-PS=PS+Pp_x/(1-p_x)-PSp_x- P{p_x}^2/(1-p_x)-PS=Pp_x/(1-p_x)-PSp_x-P{p_x}^2/(1-p_x)=Pp_x*(1/(1-p_x)-S-p_x/(1-p_x))=Pp_x*(1-S)。也就是说,δ的符号其实与p_x的大小无关,只和1-S的符号有关。当S<1时,我们比较第m道题选x还是选y,P*(1-p_x)*(S+p_x/(1-p_x))-P*(1-p_y)*(S+p_y/(1-p_y))=P*[(1-p_x)*(S+p_x/(1-p_x))-(1-p_y)*(S+p_y/(1-p_y))]=P*[S*((1-p_x)-(1-p_y))+p_x-p_y]=P*[S*(p_y-p_x)+p_x-p_y]=P*(p_x-p_y)*(1-S),因为S<1所以当p_x>p_y时,选px能让恰好对一道题的概率更大,也就是说当多选一题能让方案更优时,最优选择就是p_i最大的那道题,所以最优方案是p_i最大的一些题,贪心选即可。 假定所有的pi<1,否则选一道pi=1的题即可。设P=(1pa[i])S=(pa[i]/(1pa[i])),考虑第m+1道题选择x,那么恰好对一道题的概率的变化量δ=P(1px)(S+px/(1px))PS=PS+Ppx/(1px)PSpxPpx2/(1px)PS=Ppx/(1px)PSpxPpx2/(1px)=Ppx(1/(1px)Spx/(1px))=Ppx(1S)。也就是说,δ的符号其实与px的大小无关,只和1S的符号有关。当S<1时,我们比较第m道题选x还是选yP(1px)(S+px/(1px))P(1py)(S+py/(1py))=P[(1px)(S+px/(1px))(1py)(S+py/(1py))]=P[S((1px)(1py))+pxpy]=P[S(pypx)+pxpy]=P(pxpy)(1S),因为S<1所以当px>py时,选px能让恰好对一道题的概率更大,也就是说当多选一题能让方案更优时,最优选择就是pi最大的那道题,所以最优方案是pi最大的一些题,贪心选即可。
推导式子关键,虽然也可以直接猜

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
const int N=1e3+7;
int n;
double P,S;
db p[N],ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
	sort(p+1,p+1+n);
	for(int i=n;i;i--){
		if(1-S<0) break;

		if(i==n) {
			ans=p[i];
			P=(1-p[i]),S=p[i]/(1.0-p[i]);
		}
		else {
			ans+=(1.0*P*p[i])*1.0*(1-S);
			P*=(1-p[i]),S+=p[i]/(1.0-p[i]);
		}
	}
	printf("%.10lf",ans);
}

习题

CF_839C_Journey

CF_1778D_Flexible String Revisit

CF_912D_Fishes

CF_268E_Playlist

天天向上

posted @   MegaSam  阅读(262)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示