数学期望 学习笔记

前言

期望的广义定义:一次随机抽样中所期望的某随机变量的取值。

一个例子:

一次考试满分 100pts100pts,有 0.50.5 的概率考 90pts90pts0.30.3 的概率考 80pts80pts0.20.2 的概率考 50pts50pts,则这次考试成绩的期望即为 0.5×90+0.3×80+0.2×50=79pts0.5\times 90+0.3\times 80+0.2\times 50=79pts

与 加权平均值 类似。

P8774 爬树的甲壳虫

Problem Link

Explanation

有一只甲壳虫想要爬上一颗高度为 nn 的树,它一开始位于树根,高度为 00,当它尝试从高度 i1i-1 爬到高度为 ii 的位置时有 PiP_{i} 的概率会掉回树根,求它从树根爬到树顶时,每次尝试花费 11 个单位时间,求经过的时间的期望值是多少。

Solution

fif_i 表示从 ii 到树顶 nn 所花费时间的期望值。

接下来考虑转移,如果这次尝试成功,其期望为 (1pi+1)fi+1(1-p_{i+1})f_{i+1}。如果这次尝试失败,回到树根,则其期望为 pi+1f0p_{i+1}f_0

转移方程为:

fi=1+(ipi+1fi+1)+pi+1f0f_i=1+(i-p_{i+1}f_{i+1})+p_{i+1}f_0

观察转移方程,发现其中 f0f_0fi+1f_{i+1} 项是未知的。考虑倒推,可以求出 fi+1f_{i+1},但无论如何都无法求 f0f_0,故多写几项寻找规律:

f0=1+(ip1f1)+p1f0f1=1+(ip2f2)+p2f0f2=1+(ip3f3)+p3f0f_0=1+(i-p_1f_1)+p_1f_0\\ f_1=1+(i-p_2f_2)+p_2f_0\\ f_2=1+(i-p_3f_3)+p_3f_0

此时即可直接解方程,进行带入,展开后为:

f0=1+(1p1)+(1p1)(1p2)f2+[p1+(1p1)p2]f0f_0=1+(1-p_1)+(1-p_1)(1-p_2)f_2+[p_1+(1-p_1)p_2]f_0

因为题意中 fn=0f_n=0,所以原式化简为:

f0=1+(1p1)+[p1+(1p1)p2]f0f_0=1+(1-p_1)+[p_1+(1-p_1)p_2]f_0

将其表示为 f0=A+Bf_0=A+B 形式,则可以进行对应:

A=1+(1p1)+(1p1)(1p2)++(1p1)(1p2)(1pn1)B=p1+p2(1p1)+p3(1p1)(1p2)++pn(1pn)(1pn1)A=1+(1-p_1)+(1-p_1)(1-p_2)+\cdots+(1-p_1)(1-p_2)\cdots(1-p_{n-1})\\ B=p_1+p_2(1-p_1)+p_3(1-p_1)(1-p_2)+\cdots+p_n(1-p_n)\cdots(1-p_{n-1})

A,BA, B 都可以直接计算,则本题解决。

另外注意到数据要求输出 abmodP\frac{a}{b}\bmod P 的结果,需要用到乘法逆元,由于 PP 为质数,可以直接通过费马小定理求出。

Core Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ll ksm(ll x,ll y)//快速幂
{
ll res=1;
while(y)
{
if(y&1) res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
int a=read(),b=read();
p1[i]=a*ksm(b,mod-2)%mod;//失败概率
p2[i]=(b-a)*ksm(b,mod-2)%mod;//成功概率
}
A=1;
ll t=1;
for(int i=1;i<=n;i++)
{
if(i!=n) A=(A+p2[i]*t%mod)%mod;
B=(B+p1[i]*t%mod)%mod;
t=(p2[i]*t)%mod;
}
write(A*ksm((1-B+mod)%mod,mod-2)%mod);
return 0;
}

数学期望 学习笔记
https://blog.makerlife.top/post/math-expectation/
作者
Makerlife
发布于
2023年5月27日
许可协议