数学专题 1-概率与期望

概率与期望

前置知识

  • 高斯消元

2026.2.9

ABC280E

期望 dp 模板。

\(f_i\) 表示怪物血量剩余 \(i\) 的期望步数,则 \(f_i=f_{i+1} \times (1-\frac{p}{100}) + f_{i+2} \times \frac{p}{100}\)

答案为 \(f_0\)

P4316

发现每个点最终一定会走到终点,也就是其到终点的概率确定为 \(1\)。所以设 \(f_i\) 表示 \(i\) 走到 \(n\) 的期望长度,使用倒推。则 \(f_x=\sum \frac{1}{d_x}(f_y+w_{x,y})\)

答案即为 \(f_1\)

2026.2.10

E:P3232

用来练习高斯消元解期望方程。

根据期望线性性,答案期望=边的期望经过次数 乘上 权值。

贪心地,经过边的期望次数越多肯定希望它权值越小,设边期望经过的次数为 \(g_i\)

边的条数很多,但是点只有 \(500\) 个。并且边的期望不好计算,考虑将边的期望转化为点的期望,发现存在一条边 \((x, y)\),则 \(g_{(x, y)}=\frac{f_x}{d_x}+\frac{f_y}{d_y}\)

所以只需要求 \(f_x\)。考虑转移,只能从其他点,每个点 \(\frac{1}{d_y}\) 的概率过来,但注意 \(1\) 号点开始就在,所以要加上 \(1\)\(n\) 号点不能走出去,所以其他点不能由 \(n\) 转移贡献。所以

\[f_x= \sum_{y \not= n} f_y \times \frac{1}{d_y}+[x=1] \]

但是图是无向图,所以直接转移有后效性。将 dp 看成 \(n\) 个一次方程,用高斯消元解方程即可。

2026.2.11

B:CF113D

\(n \le 22\)不会是什么 \(2^n\) 算法吧。 显然被骗了。

实际上跟上一题类似,所有人到终点只会到一次,所以终点的概率等于期望。那么设 \(f_{x,y}\) 表示甲当前在 \(i\),乙当前在 \(j\) 的期望出现次数,同样注意如果是 \((x, y)\) 为起点需要加 \(1\),如果上一个状态为 \((x, x)\) 则不能往外转移。

\[f_{x, y}= \sum_{(x, i), (y, j), i\not=j} \frac{1-p_i}{d_i}\frac{1-p_j}{d_j}f_{i, j}+\sum_{(y, j), x\not=j} {p_x}\frac{1-p_j}{d_j}f_{x, j}+\sum_{(x, i), i\not=y} {p_y}\frac{1-p_i}{d_i}f_{i, y}+{p_x}{p_y}{f_{x, y}}+[x=a, y=b] \]

然后高斯消元,复杂度 \(O(n^6)\)

2026.2.12

A:P2973

\(f_i\) 表示 \(i\) 节点爆炸的概率,则

\[f_x=\sum_{(x, y)} f_y \times \frac{1}{d_y} \times (1-\frac{p}{q})+\frac{p}{q}[x=1] \]

高斯消元即可。

C:CF1823F

\(f_i\) 表示 \(i\) 点的期望经过次数,则

\[f_x= \begin{cases} 1 & x=t\\ \sum_{y \not= t} \frac{f_y}{d_y}+[x=s] & \text{otherwise}\\ \end{cases} \]

但是 \(n\) 很大,无法直接高斯消元。

但是每个 \(f_x\) 只会把自己的贡献传给周围的点,点数不多,考虑将 \(f_x\) 表示成 \(k_xf_{fa_x}+b_x\) 的形式,

\[f_x=\sum_{y \not= t} \frac{f_y}{d_y}+[x=s] \]

先把 \(fa_x\) 的转移单独拆分出来,

\[\begin{aligned} f_x&=\frac{f_{fa_x}}{d_{fa_x}}+\sum_{y \in son_x} \frac{f_y}{d_y}+[x=s]\\ &=\frac{f_{fa_x}}{d_{fa_x}}+\sum_{y \in son_x} \frac{k_yf_x+b_y}{d_y}+[x=s]\\ &=\frac{f_{fa_x}}{d_{fa_x}}+\sum_{y \in son_x} \frac{k_y}{d_y}f_x+\sum_{y \in son_x} \frac{b_y}{d_y}+[x=s]\\ \end{aligned} \]

转换成一次函数形式,

\[f_x=\frac{f_{fa_x}}{d_{fa_x}}+\sum_{y \in son_x} \frac{k_y}{d_y}f_x+\sum_{y \in son_x} \frac{b_y}{d_y}+[x=s]\\ \Big(1-\sum_{y \in son_x} \frac{k_y}{d_y}\Big)f_x=\frac{f_{fa_x}}{d_{fa_x}}+\sum_{y \in son_x} \frac{b_y}{d_y}+[x=s]\\ f_x=\color{cyan}{\frac{1}{\Big(1-\sum_{y \in son_x} \frac{k_y}{d_y}\Big)d_{fa_x}}}f_{fa_x}+\color{red}{{\frac{\sum_{y \in son_x} \frac{b_y}{d_y}+[x=s]}{1-\sum_{y \in son_x} \frac{k_y}{d_y}}}}\\ \]

标青色的是 \(x\) 对应的 \(k_x\),红色的是 \(b_x\)

发现这些都可以通过一遍 dfs 推出,于是两遍 dfs,一遍求 \(k_x\)\(b_x\),一遍求 \(f_x\) 即可。时间复杂度 \(O(n)\)

Q: 为什么 \(f_t\) 不能在第二遍 dfs 一开始就设为 \(1\)?这样做会出问题?

A: 子节点不应该接受来自父节点的转移,因为只要走到 \(t\) 游走就会结束。所以应该要把 \(t\) 先当成 \(0\) 来转移。

2026.2.13

D:CF24D

由于起点固定,终点不固定,所有点都会走到起点,所以我们倒着考虑,最后起点的 dp 值即为答案。

\(f_{i, j}\) 表示 \((i, j)\) 走到第 \(n\) 行的期望步数。则

\[f_{i,j}= \begin{cases} \frac{f_{i, j}+f_{i, j-1}+f_{i, j+1}+f_{i+1, j}}{4}+1 & 1<j<m \\ \frac{f_{i, j}+f_{i, j+1}+f_{i+1, j}}{3}+1 & j=1\\ \frac{f_{i, j}+f_{i, j-1}+f_{i+1, j}}{3}+1 & j=m\\ \end{cases} \]

直接高斯消元,复杂度 \(O((nm)^3)\)

观察到每一行的转移只跟下一行有关,所以可以一行一行进行高斯消元,将下一行的状态存下来,在消当前行的时候当作常数看,时间复杂度 \(O(nm^3)\)

继续观察,发现每个 dp 状态只跟相邻两个位置的 dp 值有关,我们钦定 \(f_{i, 1}\) 的 dp 值为 \(a\),即可用它表示出整行的 dp 数组。

设当前考虑第 \(i\) 行,\(i+1\) 的状态为 \(g_j\),发现所有 \(f_j\) 都可以表示成线性方程,解方程容易:

  • \(j=1\),

    \[f_1=\frac{1}{3}(f_1+f_2+g_1)+1\\ 3f_1=f_1+f_2+g_1+3\\ 2f_1=f_2+g_1+3\\ f_2=2f_1+(-g_1-3)\\ f_2=2a+(-g_1-3)\\ \]

  • \(1<j<m\),

    \[f_j=\frac{1}{4}(f_{j-1}+f_{j}+f_{j+1}+g_j)+1\\ 4f_j=f_{j-1}+f_{j}+f_{j+1}+g_j+4\\ 3f_j=f_{j-1}+f_{j+1}+g_j+4\\ f_{j+1}=3f_j-f_{j-1}+(-g_j-4)\\ f_{j+1}=3(k_ja+b_j)-(k_{j-1}a+b_{j-1})+(-g_j-4)\\ f_{j+1}=(3k_j-k_{j-1})a+(3b_j-b_{j-1}-g_j-4)\\ \]

以此类推可以表示出 \(f_m\),接着利用:

  • \(j=m\),

    \[f_m=\frac{1}{3}(f_m+f_{m-1}+g_m)+1\\ 3f_m=f_m+f_{m-1}+g_m+3\\ 2f_m=f_{m-1}+g_m+3\\ 2(k_ma+b_m)=(k_{m-1}a+b_{m-1})+g_m+3\\ (2k_m-k_{m-1})a=-2b_m+b_{m-1}+g_m+3\\ a=\frac{-2b_m+b_{m-1}+g_m+3}{2k_m-k_{m-1}}\\ \]

解出 \(a\),从而把整行解出来。这样每行只需要扫一遍,时间复杂度 \(O(nm)\)

最后注意 \(m=1\) 的特殊情况要特判,此时 \(f_{i, 1}=\frac{f_{i, 1}+f_{i+1, 1}}{2}\),直接推就好。

Q: 精度会爆炸?

A: 如果用一个未知数来表示所有数,乘 \(n\) 次之后精度会炸,所以还是需要用迭代法用前一项表示下一项来递推。

2026.2.14

学习期望线性性。

\(E(X)\) 表示 \(X\) 事件的期望,则 \(E(X+Y)=E(X)+E(Y)\)此条件在 \(X\)\(Y\) 不独立时也成立。
\(E(XY)=E(X)E(Y)\)此条件仅在 \(X\)\(Y\) 相互独立时成立。

HDU-5194

根据期望线性性,设 \(X_i\) 表示第 \(i\) 个 01 串出现的期望,则 \(E(\sum X_i)=\sum E(X_i)\)

对于每个 \(E(X)\) 单独考虑,显然是选择 \(0\) 的概率 乘上 选择 \(1\) 的概率即 \(\frac{n}{n+m}\times\frac{m}{n+m-1}\)。所以总的期望为 \(\frac{n}{n+m}\times\frac{m}{n+m-1}\times(n+m-1)=\frac{nm}{n+m}\)

E:CF453A

期望的定义,\(E(X)=\sum p_ix_i\)

所以枚举每一种可能的最大值,计算其出现的概率。设枚举的最大值为 \(k\),若所有数都出现在 \(1\)\(k\) 内,有 \(k^n\) 种情况;所有数都出现在 \(1\)\(k-1\) 内,有 \((k-1)^n\) 种情况。两者相减即可保证至少一个数为 \(k\)。所以概率为 \(\frac{k^n-(k-1)^n}{m^n}\)

因为精度问题,把式子变形,即为 \(\big(\frac{k}{m}\big)^n-\big(\frac{k-1}{m}\big)^n\)

F:CF280C

问题可以转化为:设 \(X_i\)\(i\) 被选中的次数(\(0/1\)),求 \(E(\sum X_i)\)

根据期望线性性,\(E(\sum X_i)=\sum E(X_i)\)。也就是求每个点在它的所有祖先之前被选中的期望。由于每个点最多被选一次,期望等于概率,也就是 \(\frac{1}{dep_i}\)。所以答案就是 \(\sum_{i=1}^n \frac{1}{dep_i}\)

2026.2.18

G:Gym-104324F

考虑单次询问怎么办,显然是以 \(t\) 为根做 dp,设 \(f_i\) 表示从根节点走到 \(i\) 的期望步数,则 \(f_x=\sum_{(y, x) \in E} \frac{f_y}{deg_y}+1\)。然后用 C 题的套路主元解方程就好。但是这样显然无法处理多组询问。

这时候就需要利用到期望线性性,从 \(s\)\(t\) 的期望步数可以拆分成路径上每一条边的期望步数之和。即我们只需要对于每一条边 \((u,v)\) 求从 \(u\)\(v\) 的期望步数即可。设 \(f_{(u, v)}\) 表示从 \(u\)\(v\) 的期望步数,则

\[f_{(u, v)}=1+\frac{1}{deg_u}(0+\sum_{(t, y) \in E, t \not= x}f_{(u, v)}+f_{(t, u)}) \]

即从 \(u\) 直接走上去或先走到其他点,走回来再走上去。

变形可得

\[f_{(u, v)}=deg_u+\sum_{(t, y) \in E, t \not= x}f_{(t, u)} \]

然后会发现,这个实际上是一个点子树之内点的度数之和。这个其实等于子树的 \(sz-1\)

求完只需要对期望做前缀和,求树上 LCA,时间复杂度 \(O(q \log n)\)

2026.2.19

H:P1654

首先,\((l+1)^3=l^3+3l^2+3l+1\),也就是说当长度 \(l \to l+1\),贡献变化 \(\Delta=3l^2+3l+1\)

\(f_i\) 表示前 \(i\) 个任务的期望得分,则

\[f_{i}=f_{i-1}+\sum_{l=0}^i p_i(3l^2+3l+1)\\ f_{i}=f_{i-1}+\sum_{l=0}^i 3p_il^2+3p_il+p_i \]

\(\sum p_ix\) 是期望的形式,根据期望线性性,每一个单项可以拆分开来。也就是说,我们都需要维护期望 \(E(l)\)\(E(l^2)\)。每次 \(i-1 \to i\),都有 \((1-p_i)\) 的概率长度变为 0,有 \(p_i\) 的概率加 \(1\),即

\[E(l_i)=(1-p_i) \times 0+p_i(E(l_{i-1})+1)=p_i(E(l_{i-1})+1)\\ E(l_i^2)=(1-p_i) \times 0+p_i(E(l_{i-1}^2)+2E(l_{i-1})+1)=p_i(E(l_{i-1}^2)+2E(l_{i-1})+1) \]

这样就可以递推求出来了。

I:CF1187F

一段全部相等,等价于这一段中每相邻两个元素相等。则

\[B(x)=1+\sum_{i=1}^{n-1} [x_i \not= x_{i+1}]\\ \begin{aligned} (B(x))^2&=(1+\sum_{i=1}^{n-1} [x_i \not= x_{i+1}])^2\\ &=1+2\sum_{i=1}^{n-1} [x_i \not= x_{i+1}]+\Big(\sum_{i=1}^{n-1} [x_i \not= x_{i+1}]\Big)^2\\ &=1+2\sum_{i=1}^{n-1} [x_i \not= x_{i+1}]+\sum_{i=1}^{n-1} ([x_i \not= x_{i+1}])^2+2\sum_{i=1}^{n-1} \sum_{j=i+1}^{n-1}[x_i \not= x_{i+1}][x_j \not= x_{j+1}]\\ \end{aligned} \]

\[\begin{aligned} E((B(x))^2)&=E(1+2\sum_{i=1}^{n-1} [x_i \not= x_{i+1}]+\sum_{i=1}^{n-1} ([x_i \not= x_{i+1}])^2+2\sum_{i=1}^{n-1} \sum_{j=i+1}^{n-1}[x_i \not= x_{i+1}][x_j \not= x_{j+1}])\\ &=E(1)+2E(\sum_{i=1}^{n-1} [x_i \not= x_{i+1}])+E(\sum_{i=1}^{n-1} ([x_i \not= x_{i+1}])^2)+2E(\sum_{i=1}^{n-1} \sum_{j=i+1}^{n-1}[x_i \not= x_{i+1}][x_j \not= x_{j+1}])\\ \end{aligned} \]

根据期望线性性,设 \(E(i)\) 表示 \(i\)\(i+1\) 不等的期望,又由于 \(0\)\(1\) 平方后数值不变,可以拆分成单项式:

\[E((B(x))^2)=E(1)+2\sum_{i=1}^{n-1}E(i)+\sum_{i=1}^{n-1}E(i)+2\sum_{i=1}^{n-1} \sum_{j=i+1}^{n-1}E(ij) \]

这里需要用到期望线性性的乘法性质,\(E(ij)=E(i)E(j)\) 当且仅当 \(i,j\) 独立。所以需要对于式子里的情况分类讨论,当 \(j \not= i+1,E(ij)=E(i)E(j)\),反之需要单独计算期望。这样的个数是 \(O(n)\) 的。

化简:

\[E((B(x))^2)=E(1)+3\sum_{i=1}^{n-1}E(i)+2\Big(\sum_{i=1}^{n-1}E(i)\sum_{j=i+2}^{n-1}E(j)\Big)+2\sum_{i=1}^{n-2}E(i(i+1)) \]

\(S_i=\sum_{j=i}^n E(j)\),则

\[E((B(x))^2)=E(1)+3\sum_{i=1}^{n-1}E(i)+2\sum_{i=1}^{n-1}E(i)S_{i+2}+2\sum_{i=1}^{n-2}E(i(i+1)) \]

需要注意的几个问题
  • 搞清楚随机变量和期望的区别,例如 \(B(x)=1+\sum_{i=1}^{n-1} [x_i \not= x_{i+1}]\) 中,\([x_i \not= x_{i+1}]\) 这个条件成立为随机变量,而非期望 \(E([x_i \not= x_{i+1}])\)。不要混淆转换。
  • 期望线性性,乘积成立仅当两事件独立
  • 代码细节!

2026.2.23

J:CF457D

首先可以想到根据期望线性性拆成枚举染黑行数 \(x\) 和列数 \(y\),所有期望的总和。根据期望等于概率乘权值,即

\[\sum_{x=0}^n \sum_{y=0}^n 2^{x+y} \binom{n}{x}\binom{n}{y} P(x, y) \]

错误思路

其中 \(P(x, y)\) 表示恰好染整 \(x\)\(y\) 列的概率。所以转化为计算 \(P(x, y)\)。显但是不好直接计算,考虑容斥,计算 \(G(x, y)\) 表示染 \(\ge x\) 行,\(\ge y\) 列的概率。

但是你发现复杂度过高,并且需要容斥,很难求。

正解

考虑 \(2^t\) 的组合意义,实际上是染黑的行和列的集合的子集个数。

重新定义 \(P(x, y)\) 表示保证染特定 \(x\)\(y\) 列的概率,那么其实答案就是

\[\sum_{x=0}^n \sum_{y=0}^n \binom{n}{x} \binom{n}{y} P(x, y) \]

2026.2.25

H:CF235D

首先不难想到把总贡献拆成每个节点的贡献。

每个节点想要造成贡献,必须要求它没被删除且它所在的连通块有一个点被删除。所以又可以转化为对于每一个点对 \((u, v)\)\(u\)\(v\) 前被删除,且 \(u\)\(v\) 处于同一个连通块中的期望。由于只有删和不删两种状态,所以此时概率等于期望。

那么考虑每两个点产生贡献的概率 \(P(u, v)\)。首先如果在基环树上同一棵子树内,它们中间的点一定不能被删。否则他们中任意一个被删时两者不连通。换一种角度理解,就是在它们的路径删除序列上,\(u\) 排在第一个的概率。即 \(P(u, v)=\frac{1}{d(u, v)}\)

在不同子树上,它们就会有两条 \(u \to x \to y \to v\) 的路径。\(u \to x\)\(y \to v\) 的长度和用 \(z\)\(x \to y\) 两条路径长度用 \(s\)\(t\) 表示。

那么它们中间没被删掉,就是前面两条路径中一条第一个删的,也就是 \(\frac{1}{z+s}+\frac{1}{z+t}\)。但是这样会算重,两条都没删的情况会算两遍,所以减去 \(\frac{1}{z+s+t}\)

然后暴力统计即可。

思路卡点

从每个点产生的贡献期望转换乘点对处于同一个连通块的期望。

posted @ 2026-02-25 18:25  Network_Flow  阅读(1)  评论(0)    收藏  举报