概率与期望
概率
条件概率:
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=pi∗fi−1,j−1+(1−pi)∗fi−1,j
DP式很好理解
就是第i轮发生j次事件的概率
下边的题就会用到它,还是挺常用的
cf_54C_First Digit Law
3.贪心
先考虑如何计算某个方案下恰好答对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]∗∏(1−pa[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]}))
∏(1−pa[i])∗∑(pa[i]/(1−pa[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=∏(1−pa[i]),S=∑(pa[i]/(1−pa[i])),考虑第m+1道题选择x,那么恰好对一道题的概率的变化量δ=P∗(1−px)∗(S+px/(1−px))−PS=PS+Ppx/(1−px)−PSpx−Ppx2/(1−px)−PS=Ppx/(1−px)−PSpx−Ppx2/(1−px)=Ppx∗(1/(1−px)−S−px/(1−px))=Ppx∗(1−S)。也就是说,δ的符号其实与px的大小无关,只和1−S的符号有关。当S<1时,我们比较第m道题选x还是选y,P∗(1−px)∗(S+px/(1−px))−P∗(1−py)∗(S+py/(1−py))=P∗[(1−px)∗(S+px/(1−px))−(1−py)∗(S+py/(1−py))]=P∗[S∗((1−px)−(1−py))+px−py]=P∗[S∗(py−px)+px−py]=P∗(px−py)∗(1−S),因为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
天天向上
本文来自博客园,作者:MegaSam,转载请注明原文链接:https://www.cnblogs.com/MegaSamTXL/p/17607132.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】