简单+典型的概率期望
0. Preface
- 比较简单说明的是:
- 不会涉及到贝叶斯公式、多项式之类的工具。
- 不会涉及到比较复杂的问题。比如某些概率或期望题算起来需要很多的数学技巧积累,这里并不进行这种积累。
- 比较典型是字面意思。
1. 万物之始:抽卡模型(几何分布模型)
你有 \(p\) 的概率抽到卡,\(p - 1\) 的概率抽不到卡,询问最终能抽到卡的期望次数。
直觉上期望是 \(\frac{1}{p}\) ? 这是恰好对的,但这只是巧合。
设抽到卡的期望次数为 \(E(X)\) 。
方法一:
根据期望的定义:“随机变量的所有可能取值 \(x_i\) 乘以 这个取值发生的概率 \(p(x_i)\)” 之和。(这个和显然也满足期望线性性)
这里抽卡次数可以作为随机变量。
- 有 \(p\) 的概率可以 \(1\) 次抽到卡。
- 有 \((1 - p)p\) 的概率可以前 \(1\) 次抽不到卡,第 \(2\) 次抽到卡。
- 有 \((1 - p)^{2}p\) 的概率可以前 \(2\) 次抽不到卡, \(3\) 次抽到卡。
- ...
这也叫做几何分布模型,即前 \(k - 1\) 次抽不中而第 \(k\) 次抽中的概率 \(p(k) = (1 - p)^{k - 1} p\) 。
于是可以计算期望
这不好算。当然,这是可算的。
另外,几何分布模型的结论说明了这个数值是 \(\frac{1}{p}\) 。
方法二:
将期望代入随机变量,将几何分布模型转为 0-1 分布模型,从而直接解出期望方程。
- 有 \(p\) 的概率可以 \(1\) 次抽到卡
- 有 \(1 - p\) 的概率可以 \(1 + E(X)\) 次抽到卡
1.1 例题 2023 ICPC 网络赛第二场 I Impatient Patient
problem
You accidentally sprained your ankle, and now you are facing a long recovery phase. Initially, you are at stage \(0\), and your recovery progresses until you reach stage \(n\).
Each day, if you rest properly, you advance by exactly one stage. So it takes n days for you to recover, that is, if you do not do anything improper.
However, instead of resting, you have the option to challenge yourself, which also takes one day. If you are at stage i and succeed, you will instantly recover. However, if you fail, you will regress to stage \(a_i (0 \leq a_i \leq i)\) . The probability of success is \(p_i\) .
Now, you are wondering what the expected time required for your recovery would be, assuming you adopt the best strategy.
solution
要么选择修养,要选择挑战。
-
如果选择修养,第 \(i\) 个点的恢复时间期望是 \(i + (n - i) = n\) 。
-
如果选择挑战,容易观察到对 \(> 1\) 个点选择挑战是显然不优的。
接下来只需计算在每个点在选择挑战条件下每个点的恢复时间期望。
设第 \(i\) 个点的恢复时间期望为 \(E(X_i)\) 。由期望的线性性,$E(X_i) = $ 走到这个点并选择挑战的期望 \(X\) ,加上这个点挑战结果的恢复时间期望 \(Y\) 。
显然 \(X = i + 1\) 。
对于 \(Y\) ,将期望带入随机变量,通过 0-1 分布模型解期望方程:
则
于是
2. 离散概率论的一些基本概念
下面内容不保证适用于连续概率的情况,
2.1 随机试验
符合以下三个特点的叫随机试验:
- 在相同条件下重复进行
- 能明确试验的所有可能结果,且这些结果不止一个
- 每次试验前不知道哪个结果会出现
符合随机试验的例子
- 抛一枚硬币,观察出现的是正面还是反面
- 观察某地某天的最高气温。(这是个特殊的例子,因为我们已经知道节气是有规律的)
不符合随机试验的例子
- 一名在役的 ICPC 程序设计竞赛学生,观察某天中午几点吃饭。
一个随机试验可以由多个随机试验组成
比如掷两枚骰子,观测这两枚骰子正面朝上的点数之和。等价于分两次掷一枚骰子,观测骰子正面朝上的点数。再合并两个随机试验的结果。
2.2 样本空间
样本空间:一个随机试验的所有可能结果的集合。通常用 \(\mathbb{\Omega}\) 表示。
样本点(样本):随机实验中每个可能的结果,样本空间中的基本元素。
一个随机试验根据观测对象的不同,可能存在多个样本空间。
- 一个长度为 \(3\) 的随机排列的
- 所有可能的全排列结果,它的样本空间是 \(\{[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\}\) 。显然 \(|\mathbb{\Omega}|_{1} = P_{3} = 6\) 。
- 所有可能前 \(2\) 位排列结果,它的样本空间是 \(\{[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]\}\) 。显然 \(|\mathbb{\Omega}|_{2} = P_{3}^{2} = 6\) 。
- 一副去除了 Joker 的 \(52\) 张扑克牌中随机抽出一张
- 所有可能的数字,它的样本空间是 \(\{1 \sim 13\}\) 。
- 所有可能的花色,它的样本空间是 \(\{\textbf{黑桃}, \textbf{红桃}, \textbf{梅花}, \textbf{方块}\}\) 。
2.3 随机事件
随机事件(有时简称事件),是一个样本空间的子集,也是若干样本点的集合。
2.3.1 基本事件
基本事件是一个大小为 \(1\) 的事件,它同时也是一个样本点自身的集合。这意味着事件大小不能为 \(0\) 。
2.3.2 独立事件
事件 \(\mathbb{A}\) 和 \(\mathbb{B}\) 是独立的,当且仅当 \(\mathbb{A} \cap \mathbb{B} = \emptyset\) 。同时也称 \(\mathbb{A}\) 和 \(\mathbb{B}\) 互为独立事件。
事件 \(\mathbb{X}_i, 1 \leq i \leq n\) 两两互为独立事件,当且仅当 \(\bigcap_{i}^{n} \mathbb{X}_i = \emptyset\) 。概率关系满足 \(Pro(\bigcup_{i}^{n} \mathbb{X}_i) = \prod_{i}^{n} Pro(\mathbb{X}_i)\) 。
2.3.3 互斥事件(不独立事件)
事件 \(\mathbb{X}_i, 1 \leq i \leq n\) 两两互为互斥事件,当且仅当 \(\forall 1 \leq i < j \leq n, \mathbb{A} \cap \mathbb{B} \neq \emptyset\) 。概率关系满足 \(Pro(\bigcup_{i}^{n} \mathbb{X}_i) = \sum_{i}^{n} Pro(\mathbb{X}_i)\) 。
最常见的用处是:若事件 \(\mathbb{A}\) 能划分为一组两两互斥的事件 \(\mathbb{X}_i, 1 \leq i \leq n\) ,详细地说即存在划分 \(\mathbb{A} = \bigcup_{i = 1}^{n} \mathbb{X}_i\) 且 \(\forall 1 \leq i < j \leq n, \mathbb{X}_i \cap \mathbb{Y}_i = \emptyset\) 。
则有概率关系 \(Pro(\mathbb{A}) = \sum_{i = 1}^{n} Pro(\mathbb{X}_i)\) 。
2.4 随机变量
2.4.1 随机变量是一种数学概念,用来表示随机试验结果的变量
详细地说,对于一个随机试验。若它的样本空间为 \(\mathbb{\Omega}\) ,则 \(X\) 是定义在 \(\mathbb{\Omega}\) 上的函数。
以掷一枚骰子观测正面朝上的点数的随机试验为例,样本空间为 \(\mathbb{\Omega} = \{\omega_1, \omega_2, \omega_3, \omega_4, \omega_5, \omega_6\}\) 。则随机变量 \(X\) 就是 \(\mathbb{\Omega}\) 上的函数,\(X(\omega_k) = \omega_k \ \textbf{正面朝上的点数}, \ k = 1, 2, 3, 4, 5, 6\) 。
一个随机试验的随机变量,有时也可以通过多个随机变量表示。
2.4.2 一个随机变量可以是多个随机变量的和
例如,随机试验一:掷两枚骰子,观测这两枚骰子正面朝上的点数之和,设随机变量为 \(X\) 。
随机试验二:掷一枚骰子,观测这枚骰子正面朝上的点数,设随机变量为 \(\alpha\) 。
随机试验三:掷一枚骰子,观测这枚骰子正面朝上的点数,设随机变量为 \(\beta\) 。
显然有 \(X = \alpha + \beta\) 。
2.4.3 随机变量可以是多维向量
如对地面抛钢球,观测落点的坐标,此时随机变量 \(\forall \omega \in \mathbb{\Omega}, X(\omega) =\{x, y\}, \ x,y \in \mathbb{R}\) 。
2.5 有限概率
对于事件 \(\mathbb{A}\) ,定义:
计算概率的第一种方法是检验所有样本点。以 \(O(|\mathbb{\Omega}|)\) 的事件 \(check\) 每个样本点 \(x \ (x \in \mathbb{\Omega})\) 是否满足 \(x \in \mathbb{A}\) 。
- 比如 \(\mathbb{\Omega}\) 是一个 \(n\) 的全排列的所有可能,那么 \(check\) 的时间也需要 \(O(n)\) 。于是这种方式计算概率的时间复杂度为 \(T(n \times n!) = O(n!)\) 。
计算概率的第二种方法是利用组合计数法。只需快速计数出 \(|\mathbb{A}|, |\mathbb{\Omega}|\) 。
- 计数 \(|\mathbb{\Omega}|\) 的时间通常显然是 \(O(1)\) 的。
- 计算概率的时间复杂度,依赖于设计的组合计数法对 \(|\mathbb{A}|\) 计算的时间复杂度。
例:随机试验:\(n\) 的随机排列;事件 \(\mathbb{A}\) = “第一个位置上的数 \(x\) 满足 \(3 \mid x\) 的排列”。计算 \(Pro(\mathbb{A})\) 。
样本空间 \(\mathbb{\Omega}\) 显然是所有排列,它的大小 \(|\mathbb{\Omega}| = P_{n} = n!\) 。计算时间为 \(O(1)\) 。
事件 \(\mathbb{A}\) ,第一个位置的 \(x\) 有 \(\lfloor \frac{n}{3} \rfloor\) 种,则 \(|\mathbb{A}| = \lfloor \frac{n}{3} \rfloor \times P_{n - 1} = \lfloor \frac{n}{3} \rfloor \times (n - 1)!\) 。计算时间为 \(O(1)\) 。
于是 \(Pro(\mathbb{A}) = \frac{\lfloor \frac{n}{3} \rfloor}{n}\) 。计算时间为 \(O(1)\) 。
可以通过改变随机试验的观测对象,缩小样本空间。
样本空间 \(\mathbb{\Omega}\) 为:随机 \(n\) 排列的第一位的所有可能,它的大小 \(|\mathbb{\Omega}| = n\) 。计算时间为 \(O(1)\) 。
同时事件 \(\mathbb{A}\) 随之变为:“随机 \(n\) 排列的第一个位置上的数 \(x\) 满足 \(3 \mid x\) ”,则 \(|\mathbb{A}| = \lfloor \frac{n}{3} \rfloor\) 。计算时间为 \(O(1)\) 。
于是 \(Pro(\mathbb{A}) = \frac{\lfloor \frac{n}{3} \rfloor}{n}\) 。计算时间为 \(O(1)\) 。
2.6 数学期望
对于随机变量 \(X\) ,定义
其中 \(x\) 是随机变量 \(X\) 的所有取值。
当随机变量是一维的时候,可以直观写成
期望计算的难度通常不在于时间,而在于随机变量的选取和划分。
2.6.1 期望的线性性
“两个(或多个)随机变量的和的期望”等于“两个(或多个)随机变量的期望的和”
解释: 随机变量本质上是定义在 \(\mathbb{\Omega}\) 上的函数,\(x \in X\) 的形式表明 \(x\) 是函数 \(X\) 值域上的任意数。对初学者来说这个符号可能不易直接理解。
重要程度:期望的线性性让不独立随机变量之间具备了期望的可加性。方便了期望的转移。
注:随机变量和随机实验是一一对应的,更详细的说,如果能将随机试验划分,那么“随机试验的结果的和期望”等于“随机试验的结果的期望的和”。
例如抽卡模型种:
- 抽卡次数的期望直观计算是一个收敛的无穷级数。
- 将随机变量划分为“是否抽到”与“是否没抽到”,则有 \(E(X) = E(\alpha) + E(\beta) = p E(X) + (1 - p)(1 + E(X))\) 。
2.7 离散概率论中的转移
2.7.1 不独立的事件之间显然可以进行概率转移
起始事件的概率显然为 \(1\) ,于是从起点往终点递推。
若事件 \(A\) 有 \(p_i\) 的概率转移被事件 \(\mathbb{\alpha}_i\) 转移且 \(\sum p_i = 1\) :
若事件 \(A\) 有 \(q_i\) 的概率转移到事件 \(\mathbb{\beta}_i\) 且 \(\sum q_i = 1\) :
2.7.2 同一个随机变量的取值之间可以进行转移
终点取值的期望显然为 \(0\) ,于是从终点往起点递推。
若取值 \(X = x\) 有 \(p_i\) 的概率被取值 \(X = \gamma\) 花费 \(f_i\) 的代价达到且 \(\sum p_i = 1\) :
若取值 \(X = x\) 有 \(q_i\) 的概率花费 \(g_i\) 的代价达到取值 \(X = \lambda_i\) 且 \(\sum q_i = 1\) :
2.7.3 基于期望的线性性,任意随机变量之间显然可以进行期望“转移”
若 \(E(X) = E(\sum \mu_i)\) ,则 \(E(X) = \sum E(\mu_i)\) 。
3. 离散概率的常见性质与练习
3.1 简单例题 1
随机一个长度为 \(n\) 的排列 \(p\) ,求 \(p_{1 \sim i}\) 中 \(p_i\) 是最大值的概率。
设 \(\mathcal{P}(\mathbb{A})\) 为 \(p_{1 \sim i}\) 中 \(p_i\) 是最大的概率。设 \(P_{n}^{m}\) 为 \(n\) 的 \(m\) 排列。
组合计数法
观测目光放在整个排列。
样本空间的大小显然是 \(n\) 的全排列 \(n!\) 。接下来只需算事件“\(p_{1 \sim i}\) 中 \(p_i\) 是最大值”的大小。
第 \(i\) 位上的可能是 \(i \sim n\) ,选出任意一个,假设选出 \(k, i \leq k \leq n\) 。方案数是 \(\binom{n - i + 1}{1} = n - i + 1\) 。由于不确定 \(k\) ,用 \(T(n - i + 1)\) 的时间枚举。
前 \(i - 1\) 为上的可能是 \(1 \sim k - 1\) ,从这 \(k - 1\) 个数选出 \(i - 1\) 个进行排列。方案数是 \(P_{k - 1}^{i - 1}\)
后 \(n - i\) 个位置,让剩下 \(n - i\) 个数进行全排列。方案数是 \(P_{n - i}\)
于是
继续化简比较困难,直接计算的复杂度是 \(O(n)\) 。
优化观测对象
观测对象只需要放在前 \(i\) 个位置,其他位置没有影响。
样本空间的大小显然为 \(n\) 的 \(i\) 排列 \(P_{n}^{i}\) 。
事件的大小。只需从 \(n\) 个数中选出 \(i\) 个,钦定最大值在第 \(i\) 位,另外 \(i - 1\) 个数全排列。方案数为 \(\binom{n}{i} P_{i - 1}\) 。
那么有
比较显然了,时间复杂度 \(O(1)\) 。
对称性
\(n \ (2 \leq n)\) 个数的全随机排列,对它们编号 \(1 \sim n\) 。
考虑全排列的任意两个位置 \(i, j\) 。这两个位置是对称的,换句话说 \(\_\_p_i\_\_p_j\_\_\) 出现多少次,也一定有 \(\_\_p_j\_\_p_i\_\_\) 出现多少次。
考虑全排列的任意 \(k\) 个位置,这 \(k\) 个位置里面任意两个位置也是对称的。于是任意数 \(p_x \ (1 \leq x \leq n)\) 在这 \(k\) 个位置出现的次数是相同的,或者说是等概率的。
注意到位置经过捆绑之后,位置的对称性显然失效。这是因为捆绑位置并没有使样本空间变小,只是方便了随机事件的计数。
于是只考虑前 \(i\) 个位置的一个子排列,这个子排列的最大值在每个位置出现的概率相同,均为 \(\frac{1}{i}\) 。即
对于对称性,不难发现任意 \(n\) 的 \(m\) 排列都是对称的。所以面对 \(n\) 选 \(m\) 的概率问题,可以直接将观测对象放到 \(m\) 大小的子排列上。
3.2 简单例题 2
随机一个长度为 \(n\) 的排列 \(p\) ,求 \(i\) 严格在 \(j\) 后面的概率。
组合计数法
样本空间大小显然是 \(n!\) 。
为了计数事件大小,需要将 \(ij\) 两个数捆绑。
在 \(1 \sim n - 1\) 中选出一个位置,钦定连续放入 \(ij\) 两个数。剩下的位置全排列。
3.3 简单例题 3
随机一个长度为 \(n\) 的排列 \(p\) ,求 \(i\) 在 \(j\) 后面的概率(\(1 \leq i < j \leq n\))。
考虑到存在对称性,直接计算
\(i\) 和 \(j\) 出现的任意两个位置对称,任意数在这两个位置出现的概率相等。要么是 \(\_\_i\_\_j\_\_\) 要么是 \(\_\_j\_\_i\_\_\) 。于是 \(\mathbb{P} = \frac{1}{2}\) 。
没观察到对称性的话也可以直接组合计数。
组合计数法
显然可以将观测对象放到 \(i, j\) 出现的两个位置上,取这个 \(2\) 的子排列。
样本空间大小为 \(P_{2} = 2! = 2\) 。事件为钦定的一个基本事件,大小为 \(1\) 。
使用耿直一些的笨方法,直接将观测对象作为整个排列也是可以的。
即样本空间大小为 \(P_{n} = n!\) 。
事件大小为:\(n\) 个位置中,任选两个位置,钦定顺序放入 \(i, j\) 。剩下位置全排列。
于是
3.4 简单例题 4
随机一个长度为 \(n\) 的排列 \(p\) ,求它包含 \(w_{1 \sim m}\) 作为子串的概率。
首先敏感地,\(w_i \neq w_j, w_i <= n\) 是需要保证的,否则概率是 \(0\) 。下面不提。
观测对象只能放到整个排列上,没有优化空间。
样本空间的大小是显然的 \(P_{n} = n!\) 。
事件的大小,可以在 \(1 \sim n - m + 1\) 这些位置中选择一个位置,钦定连续放入 \(w_{1 \sim m}\) 。剩下 $n - m $ 个位置全排列。
3.5 简单例题 5
随机一个长度为 \(n\) 的排列 \(p\) ,求它包含 \(w_{1 \sim m}\) 作为子序列的概率。
观测对象可以直接放到 \(w_{1 \sim m}\) 出现的 \(m\) 个位置上,取这个 \(m\) 大小的子排列。
样本空间大小 \(P_{m} = m!\) 。
事件是被钦定的一种基本事件,大小 \(1\) 。
所以
也可以使用耿直的方法,观测对象为整个排列。
样本空间大小为 \(P_{n} = n!\) 。
事件为 \(n\) 个位置中选 \(m\) 个,钦定顺序放入 \(w_{1 \sim m}\) ,剩下 \(n - m\) 个位置全排列。
3.6 简单例题 6
这是一个真正意义上的不那么入门的简单例题,套了一个 trick 。
给一个序列 \(a\) ,每次随机删除一个元素,问 \(a_i\) 和 \(a_j\) 在过程中相邻的概率。
3.6.1 trick 源
给一个排列 \(p = [p_1, p_2, \cdots, p_n]\) 代表第 \(i\) 个数被删除的时间。询问删除过程中有多少对数可以相邻。
实际上是询问有多少对 \((i, j)\) 满足 \(1 \leq i < j \leq n, max\{p_{i + 1}, p_{i + 2}, \cdots, p_{j - 1}\} < min(p_i, p_j)\) 。再然后这是个裸的单调栈,于是做完了。
证明:
顺序遍历 \(i \ \textbf{from} \ 1 \to n\) ,计算以 \(i\) 为右端点的所有数对。
- 若 \(\exists j < i, p_j > p_i\) 。则从 \(i - 1\) 结尾,到第一个 \(k \ (1 \leq k \leq i - 1)\) 满足 \(p_k > p_i\) 开始,的最长连续递减子序列,其中每个数都是一个以 \(i\) 为右端点的数对可以匹配的左端点。
- 若 \(\not \exists j < i, p_j > p_i\) 。则从 \(i - 1\) 结尾,到最后一个 \(k \ (1 \leq k \leq i - 1)\) 满足 \(p_k < p_i\) 开始,的最长连续递减子序列,其中每个数都是一个以 \(i\) 为右端点的数对可以匹配的左端点。
这些数的个数是极大的。不难发现这个问题的极大就是最大。
\(\square\)
实际上可以维护一个单调递减栈,对于新加入的 \(p_{i}\) ,它弹出的每个数等价:则从 \(i - 1\) 结尾到最后一个 \(k \ (1 \leq k \leq i - 1)\) 满足 \(p_k < p_i\) 开始的最长连续递减子序列。将这些数全部计数。
只需要再检查是否栈顶存在,若存在则栈顶元素 \(> p_{i}\) ,计数再加一。
3.6.2 trick 源的某个扩展
给一个序列 \(a = [a_1, a_2, \cdots, a_n]\) 代表第 \(i\) 个数被删除的时间。若 \(a_i = a_j\) 说明它们删除的顺序随机。询问删除过程中有多少对数可以相邻。
实际上是询问有多少对 \((i, j)\) 满足 \(1 \leq i < j \leq n, max\{a_{i + 1}, a_{i + 2}, \cdots, a_{j - 1}\} \leq min(a_i, a_j)\) 。
实际上依旧是维护单调非递减栈,依旧考虑统计所有 \(i\) 为右端点的对数,以此统计所有对数。不妨设这个数为 \(ans\) 。
这时候需要多维护一个 \(cnt[val]\) 为栈中元素的个数。
若 \(a_{i}\) 加入单调栈之前,被它弹出的数都和它匹配。每弹出一次 \(ans++\) ,\(cnt[stk[top - 1]]--, top--\)。
然后考虑 \(a_{i}\) 即将加入单调栈时:
- 若栈顶为空,则显然 \(ans\) 不增加。
- 若栈顶非空,且栈顶元素 \(> a_{i}\) ,\(ans\) 也只需要 \(+1\) 即可。
- 若栈顶非空,且栈顶元素 \(= a_{i}\) ,这时候分栈顶元素是否等于栈底元素讨论
- 若栈顶元素等于栈底元素,则 \(ans += cnt[stk[top - 1]]\) 。这是显然的。
- 若栈顶元素大于栈底元素,则 \(ans += cnt[stk[top - 1]] + cnt[stk[top - 2]]\) 。当计算完相同元素的贡献,还要计算左边一个比它更大元素的贡献。
更新栈底元素,更新 \(cnt\) ,更新单调栈。
3.6.3 利用了 trick 的当前问题
知道这个 trick 后。我们回来看原问题:
给一个序列 \(a\) ,每次随机删除一个元素,问 \(a_i\) 和 \(a_j \ (j > i)\) 在过程中相邻的概率。
实际上首先要做的事情是:随机删除元素即,随机一个时间戳的排列 \(p\) 给原序列。第 \(i \ (1 \leq i \leq n)\) 个元素的删除顺序是 \(p_i\) 。
可以将观测对象放到 \(i, i + 1, \cdots, j\) 这 \(j - i + 1 = m\) 个位置上。这需要考虑这个 \(m\) 大小的子排列,假设为 \(q_1, q_2, \cdots, q_m\) 。
样本空间显然是 \(P_{m} = m! = (j - i + 1)!\)
那么只需要考虑 \(q_1, q_m\) 是最大的两个数的事件。钦定最大两个数放入子排列的 \(1, m\) 位置并全排列,其他 \(m - 2\) 个位置去安排列。
如果我们直接观测整个排列会发什么?
样本空间大小显然是 \(P_{n}\) 。
事件为 \(p_i, p_{i + 1}, \cdots, p_{j}\) 中 \(\forall i < k < j, p_k < min(p_{i}, p_{j})\) 。
考虑 \(m = j - i + 1\) ,则 \(a_i, a_j\) 中最大值 \(mx_1\) 不能属于 \(m - 1\) 个最小的数,次大值 \(mx_2\) 比最大值小且不能属于 \(m - 2\) 个最小的数。于是 \(m - 1 \leq mx_2 < mx_1 \leq n\) 。
对于 \(i, j\) 位置。它们夹着的位置确定的数的范围由 \(p_i, p_j\) 决定,枚举一个最大的值 \(k \in [m, n]\) ,再枚举 \(l \in [m - 1, k - 1]\) 。将这两个数放入 \(i, j\) 两个位置并全排列。
然后是从 \(l - 1\) 个比 \(min(p_i, p_j)\) 小的数中选择 \(m - 2\) 个数,放入位置 \(i + 1, i + 2, \cdots, j - 1\) 这 \(m - 2\) 并全排列。
最后剩下的 \(n - m\) 个数到剩下的位置全排列。
所以
这一看上去就很难化简,不化简直接算的话需要 \(O(n^{2})\) 的时间复杂度。
4. 期望的线性性练习
为了体现期望线性性的优越性,会先使用定义法,再使用线性性。
同时也因为一些比较复杂的问题,直观上只能使用定义法,需要经过一些转化才能具备线性性。
4.1 简单例题 1
箱子里有 \(n\) 个球标号数字为 \(1, 2, \cdots, n\) 。从里面拿 \(m\) 次球,不放回。求期望数字之和。
直接枚举随机变量 \(X\) 的取值计算吗?
直接枚举随机变量 \(X = i, i \in [\sum_{i = 1}^{m} i = A, \sum_{i = 1}^{m} n - m + i = B]\) ?
期望取值是 \(O(n m)\) 的,概率更难算。非常恐怖。
考虑随机变量可以是多个随机变量的和。
随机变量 \(X = \sum_{i - 1}^{m} Y_m\) ,\(Y_i\) 为拿出第 \(i\) 个球上的数字。
将 \(X\) 划分后直接计算吗?
考虑如何计算 \(\mathcal{P}(i = \sum_{i = 1}^{m})\) 。考虑组合计数,总方案是 \(\binom{n}{m}\) ,符合条件 \(i = \sum_{j = 1}^{m} X_j\) 的方案数看起来比较显然的办法是跑一个 \(O(nV)\) \(01\) 背包。
直接算的复杂度是 \(T(V^{2}n) = O(n^{5})\) 的,问题更坏了。那划分没有用吗?划分后用期望的线性性!
将 \(X\) 划分后使用期望线性性计算!
于是 \(E(X)\) 只需要 \(O(1)\) 的时间即可解。
say more thing
如果可以放回,每次拿是显然独立的,然后最终算出来的期望也是 \(m \sum_{i = 1}^{n} \frac{i}{n} = \frac{m(n + 1)}{2}\) 。或许有点反直觉,但这是期望的本质。
4.2 简单例题 2
随机一个长度为 \(n\) 的排列 \(p\) ,求 \(p_i \ (1 \sim i \leq n)\) 中 \(p_i\) 是最大值的这样的 \(i\) 的期望个数。
这里可以把随机变量 \(X\) 化为一些布尔变量的和。
划分随机变量 \(X = \sum_{i = 1}^{n} Y_i \ (1 \leq i \leq n)\) ,\(Y_i\) 为:
于是
4.3 简单例题 3
随机一个长度为 \(n\) 的排列 \(p\) ,求排列中极大值的期望个数。
同样可以将 \(X\) 化为布尔变量的和。\(X = \sum_{i = 1}^{n} Y_i\) ,\(Y_i\) 为
4.4 简单例题 4
有 \(n\) 个白球,\(m\) 个黑球,每次随机取出一个球,不放回。将取出的球的颜色写成一个 \(01\) 序列,求 "01" 出现次数的期望。
经典的随机变量划分,设随机变量的取值 \(X = \sum_{i = 1}^{n - 1} Y_i\) ,其中 \(Y_i\) 为
对于事件第 \(i, i + 1\) 个位置是 \(0, 1\) 。直接钦定顺序放入 \(0, 1\) ,剩下 \(n - 2\) 个位置全排列。让事件大小除以样本空间大小得到概率。
4.5 简单例题 5(非常经典)
有 \(n\) 个白球,\(m\) 个黑球,每次随机取出一个球,不放回。将取出的球的颜色写成一个 \(01\) 序列,求期望多少步能取出所有的黑球。
此题和前面题的区别是,随机变量的划分方式需要使用一个经典的 trick 。
考虑直接计算期望。
其中 \(i!\) 是 \(i\) 个球全排列,\(\binom{i - 1}{m - 1}\) 是前 \(i - 1\) 个位置选 \(m - 1\) 个位置放入黑球的方案数。
时间复杂度 \(O(n + m)\) 。
怎么利用期望的线性性计算?
或者说怎么把随机变量划分成一组性质良好的随机变量?
考虑 \(\frac{m}{m + 1}\) ,最后一个黑球前抽出了一个白球,意味着 \(m\) 个黑球与 \(1\) 个白球随机排列,这个白球不是最后一个被抽出的概率。
时间复杂度 \(O(1)\) 。
4.6 简单例题 6
\(n\) 个硬币面值为 \(a_1, a_2, \cdots, a_n\) 随机排列。对于一个排列,初始时硬币都朝上。从左到右看每个硬币,将这个硬币翻转,并将它右边所有面值是他倍数的硬币翻转。求最终硬币朝上的期望个数。
这个题是很符合竞赛风格的基础期望题。
设当前试验的随机变量是 \(X\) ,很经典的布尔型期望划分 \(X = \sum_{i = 1}^{n} Y_i\) , \(Y_i\) 为
事件“\(Y_i = 1\)”等价于事件“第 \(i\) 个枚左边有偶数个它的约数”。缩小观测对象为“它自己 \(\cup\) 面值为这枚硬币的约数的所有硬币”。于是事件等价于这枚硬币在这些硬币中左起的第奇数个位置。这个概率实际上为 \(1 + \lfloor \frac{tot}{2} \rfloor\) 或 \(\lceil \frac{tot}{2} \rceil\) 。
期望计算的时间为 \(O(1)\) 。但值域比较大时寻找约数个数的时间耗费为 \(O(n^{2})\) 。值域为 \(M\) 且不大时有个经典的 \(O(M \log M)\) 寻找约数或倍数的方法。
5. Random Walk 、马尔可夫链
5.1 马尔可夫链
一个有限状态空间中,一个状态转移到另一个状态的随机过程。
马尔可夫链可以看作一组无限长度的随机变量序列:\(X_1, x_2, \cdots, X_n, \cdots\) 。\(X_i\) 表示第 \(i\) 步时到达的状态。
无记忆性:下一状态的概率分布只有当前状态决定
很多转移也具有无记忆性,但马尔可夫链模型的无记忆性需要被强调,这是个比较普适的模型。
状态出度的概率之和为 \(1\):显然当前状态分配给后续状态的概率之和只能为 \(1\) 。
研究马尔可夫链时,通常可以用一维上的简单边界随机游走模型处理。
竞赛中的解题思路:
一个好的解决思路是:
- 写出递推方程组
- 方程组能通过一些数学方法得到通项?
- 只是一个普通的 DP 而不是马尔可夫链?
- 是马尔可夫链?
- 将问题转化为马尔可夫链。
- 没环通常能直接 DP
- 否则要消元
5.2 Random Walk
一维简单边界随机游走
对称随机游走
对称随机游走与普通随机游走的区别是:对称随机游走中,从当前状态到下一状态的概率分布是相同的。
本质上依旧可以使用马尔可夫链 DP 的做法。
但有时候这类模型会将数据限制成不能 DP 。这时候通常容易写出状态转移矩阵,或者能直接对进行观察。
高维随机游走
-
比如二维随机游走可以看作是在无限微分的网格图上进行的马尔可夫过程,显然不容易通过普通的离散数学工具解决。
-
二维随机游走的解决方式比一维随机游走复杂许多,三维随机游走的解决方式极其复杂,四维以上随机游走在学术界中可以被证明有解但还未研究出解。
-
幸运的是当前很多常见的随机游走问题都可以抽象成有限状态空间上的一维简单边界随机游走。竞赛一类趋向于短时间表现的运动,基本不会涉及一维以上的随机游走。
5.3 常见的随机游走
5.3.1 经典轴上随机游走
5.3.1.1 回家问题 1 :回家概率
\(n + 1\) 个点构成一条链 \(0-1-2-\cdots-n\) 。从 \(i(0 \leq i \leq n)\) 号点出发,每次有 \(\frac{1}{2}\) 的概率向右或向左走一步,当到达 \(0\) 或 \(n\) 号点则停止。询问从 \(i\) 号点走到 \(0\) 号点的概率。
solution
设 \(f(i)\) 为 \(i\) 号点到 \(0\) 号点的概率。
首先一定有
对于 \(i = 1, 2, \cdots, n - 1\) ,有 \(\frac{1}{2}\) 的概率走到 \(i - 1\) 或 \(i + 1\) 。根据随机事件的递推关系有递推式:
但是整个递推式方程组明显有环。
幸运的是递推式方程组是线性的,于是至少可以将它写成 \(n + 1\) 阶的矩阵形式:
线性方程组经过一些简单变换后,容易发现满秩,有唯一解。不难发现可以 \(O(n)\) 消元解决(具体怎么做可能需要使用一下注意力,而且你不会打算进行 \(O(n^{3})\) 的高斯消元吧?)。
还能更快吗?
注意到,对于 \(1 \leq i \leq n - 1\) :
这说明整条链上的概率,构成一个等差数列。
数列中我们至少知道 \(2\) 个数,已知该数列是等差数列,只需设公差为 \(d\) 即可解出 \(d\) :
然后求得通项:
say one more thing 1
一定要走到两个端点就停止吗?让问题变为走到 \(0\) 停止,走到 \(n\) 只能往 \(n - 1\) 走。行不行?
这样的话就不存在 \(f(n) = 0\) ,而是 \(f(n) = f(n - 1)\) 。矩阵则变成了:
显然满秩(至少主对角线可以连成)。
能不能更快?
可以注意到是等差数列,但公差 \(d\) 未知。数列中只知道一项。于是不能求出通向。
于是几乎只能进行消元,矩阵的特殊性使其可以进行 \(O(n)\) 消元。
say one more thing 2
如果还需要求出计算走到 \(n\) 号点的概率呢?
设 \(x\) 走到 \(n\) 号点的概率为 \(g(x)\) 。首先确实可以直接算。
如果已知上文中的 \(f\) ,不难发现 \(h \circ f = g\) ,\(h\) 是置换 \(x = n - x\) 。
与是有 \(g(n - i) = f(i) = \frac{n - i}{n} \Leftrightarrow f(i) = \frac{i}{n}\) 。
5.3.1.2 回家问题 2 :回家期望
\(n + 1\) 个点构成一条链 \(0-1-2-\cdots-n\) 。从 \(i(0 \leq i \leq n)\) 号点出发,每次有 \(\frac{1}{2}\) 的概率向右或向左走一步。在到达 \(n\) 号点时只能走向 \(n - 1\) 号点。当到达 \(0\) 点则停止。询问从 \(i\) 号点走到 \(0\) 号点的期望。
solution
设 \(f(i)\) 为 \(i\) 号点到 \(0\) 号点的期望。首先有
对于 \(i = 1, 2, \cdots, n - 1\) ,有 \(\frac{1}{2}\) 的概率走到 \(i - 1\) 或 \(i + 1\) 。根据随机变量的取值之间的递推关系,有递推式
显然递推式成环。一个 naive 但有效的做法是观察增广矩阵:
显然是满秩的(至少主对角线连城一条线),至少可以高斯消元。
能更快吗?
注意到,对于 \(1 \leq i \leq n - 1\) :
链上的期望的差值是等差的!
已知一个边界 \(f(0)\) ,已知公差 \(2\) 。可以直接差分算通项。
say one more thing
如果问题改为,走到 \(n\) 号点会停止,走到 \(0\) 号点只能往右。求 \(i\) 到 \(n\) 号点的期望 \(g(i)\) 该怎么做?
依旧可以观察出差分递推,或者直接矩阵展开。
如果已经知道 \(f\) ,那么容易发现 \(h \circ f = g\) ,其中 \(h\) 为 \(x = n - x\) 。
然后有 \(g(n - i) = f(i) = i(2n - i) \Leftrightarrow g(i) = (n - i)(n + i) = n^{2} - i^{2}\) 。
5.3.1.3 酒鬼失足与赌徒破产
-
一个醉鬼行走在一头是悬崖的道路上,酒鬼从距离悬崖仅一步之遥的位置出发,向前一步或向后退一步的概率皆为 \(\frac{1}{2}\) ,问酒鬼失足掉入悬崖的概率是多少?
问题等价于在 \([0, +\infty]\) 的数轴上,酒鬼开始在 \(i = 1\) ,每次有 \(\frac{1}{2}\) 的概率向左或向右,询问到达 \(0\) 的概率 \(\mathcal{P}(0)\) 是多少。
显然是 \(\mathcal{P}(0) = \frac{\infty - 1}{\infty}\) 。
-
赌徒在赌场赌博,和庄家玩公平游戏。赢的概率是 \(\frac{1}{2}\) ,输的概率 \(\frac{1}{2}\) 。假设赌徒最开始时有赌金 \(a\) 元,庄家本金 \(b\) 元。赢了赌金加 \(1\) 元,输了赌金减 \(1\) 元。问赌徒输光的概率是多少?
问题等价于在 \([0, a + b]\) 的数轴上,赌徒开始在 \(i = a\) ,每次有 \(\frac{1}{2}\) 的概率向左或向右,询问到达 \(0\) 的概率 \(\mathcal{P}(0)\) 是多少。
显然是 \(\mathcal{P}(0) = \frac{b}{a + b}\) 。当 \(b \to \infty\) ,\(\mathcal{P}(0) \to 1\) 。
-
赌徒在赌场赌博,和庄家玩不公平游戏。赢的概率是 \(p\) ,输的概率 \(1-p\) 。假设赌徒最开始时有赌金 \(a\) 元,庄家本金 \(b\) 元。赢了赌金加 \(a\) 元,输了赌金减 \(1\) 元。问赌徒输光的概率是多少?
可以写出概率转移公式,然后写出线性方程组 \(f(x) = p f(x + 1) + (1 - p) f(x - 1)\) 。
一个 naive 的办法是写出线性方程组然后进行消元,但是时间复杂度很高。
需要解决的话需要数学科班的知识。但可以预料到到只要庄家本金相交赌徒本金是无限多,则赌徒输的概率无限接近 \(1\) 。
5.3.2 有向图上随机游走
5.3.2.1 走路 1
蜗蜗的世界里有 n 个城市,城市之间通过 m 条单向高速公路连接,初始他在 1 号城市。蜗蜗想去 n 号城市游玩,假设现在他在 x 号城市,他会等概率地选择从 x 出发的高速公路中的一条走过去。如果没有任何从 x 号城里出发的高速公路,他就只能留在原地了。蜗蜗会一直走直到他无路可走。
请问蜗蜗有多大的概率能够走到 n 号城市。
\(1 \leq x < y \leq n, 2 \leq n \leq 100, 1 \leq 1000 \leq m, MOD = 10^{9}+7\)
solution
设置状态 \(f[i]\) 为从 \(1\) 号点走到 \(i\) 号点的概率,首先 \(f[1] = 1\) 。
由马尔可夫链,显然
显然无环。
枚举 \(i\) 从小往大 DP 即可
int n, m; std ::cin >> n >> m;
initgraph(n);
for (int i = 1; i <= m; i++) {
int u, v; std::cin >> u >> v;
addedge(u, v);
}
std::vector<int> f(n + 1);
f[1] = 1;
for (int i = 1; i <= n; i++) {
int sz = 0;
for (int j = head[i]; ~j; j = e[j].nxt) sz++;
for (int j = head[i]; ~j; j = e[j].nxt) {
int u = i, v = e[j].v;
f[v] = (f[v] + f[u] * ksm(sz, MOD - 2) % MOD) % MOD;
}
}
std ::cout << f[n] << "\n";
考虑逆元,时间复杂度 \(O((n + m) \log n)\) 。
5.3.2.2 走路 2
蜗蜗的世界里有 n 个城市,城市之间通过 m 条单向高速公路连接,初始他在 1 号城市。蜗蜗想去 n 号城市游玩,假设现在他在 x 号城市,他会等概率地选择从 x 出发的高速公路中的一条走过去。如果没有任何从 x 号城里出发的高速公路,他就只能留在原地了。蜗蜗会一直走直到他无路可走。
请问蜗蜗期望多少步能够走到 n 号城市。
\(1 \leq x < y \leq n, 2 \leq n \leq 100, 1 \leq 1000 \leq m, MOD = 10^{9}+7\)
solution
设置状态 \(f[i]\) 为从 \(1\) 号点走到 \(i\) 号点的期望,首先 \(f[n] = 1\) 。
由马尔可夫链,显然
显然无环。
枚举 \(i\) 从大往小 DP 即可
int n, m; std ::cin >> n >> m;
initgraph(n);
for (int i = 1; i <= m; i++) {
int u, v; std::cin >> u >> v;
addedge(u, v);
}
std::vector<int> f(n + 1);
f[n] = 0;
for (int i = n; i >= 1; --i) {
int sz = 0;
for (int j = head[i]; ~j; j = e[j].nxt) sz++;
for (int j = head[i]; ~j; j = e[j].nxt) {
int u = i, v = e[j].v;
f[u] = (f[u] + (f[v] + 1) % MOD * ksm(sz, MOD - 2) % MOD) % MOD;
}
}
std::cout << f[1] << "\n";
考虑逆元,时间复杂度 \(O((n + m) \log n)\) 。
5.3.3 无向图上随机游走
走路 PRO
蜗蜗的世界里有 n 个城市,城市之间通过 m 条单向高速公路连接,初始他在 1 号城市。蜗蜗想去 n 号城市游玩,假设现在他在 x 号城市,他会等概率地选择从 x 出发的高速公路中的一条走过去。如果没有任何从 x 号城里出发的高速公路,他就只能留在原地了。蜗蜗会一直走直到他无路可走。
请问蜗蜗期望多少步能够走到 n 号城市。
\(1 \leq x, y \leq n, 2 \leq n \leq 100, 1 \leq 1000 \leq m, MOD = 10^{9}+7\)
solution
注意到这题数据没有保证 \(x < y\) ,即没有保证图存在拓扑序。
大概率需要高斯消元。
由马尔可夫链,显然
于是有矩阵
设置状态 \(f[i]\) 为从 \(1\) 号点走到 \(i\) 号点的期望,首先 \(f[n] = 0\) 。
对于 \(1 \leq i \leq n - 1\) ,依然有
整理得
共可以得到 \(n - 1\) 个这种线性方程组。
考虑终点时候的 \(i = n\) ,有 \(1 \times f[n] = 0\) 。
于是对 \(n \times n\) 的线性方程组矩阵和 \(n \times 1\) 的值矩阵组成的增广矩阵赋值系数,并进行高斯约旦消元即可。
int n, m; std::cin >> n >> m;
initgraph(n);
for (int i = 1; i <= m; i++) {
int u, v; std::cin >> u >> v;
addedge(u, v);
}
std::vector<std::vector<i64> > f(n + 1, std::vector<i64>(n + 1, 0));
std::vector<i64> v(n + 1, 0);
for (int i = 1; i < n; i++) {
f[i][i] = 1; v[i] = 1;
int sz = 0;
for (int j = head[i]; ~j; j = e[j].nxt) sz++;
for (int j = head[i]; ~j; j = e[j].nxt) {
f[i][e[j].v] = MOD - ksm(sz, MOD - 2);
}
}
f[n][n] = 1; v[n] = 0;
int r = 1;
for (int j = 1; j <= n; j++) {
for (int i = r + 1; i <= n; i++) {
if (f[i][j]) {
for (int k = 1; k <= n; k++)
std::swap(f[i][k], f[r][k]);
std::swap(v[i], v[r]);
break;
}
}
if (f[r][j] == 0) continue;
for (int i = 1; i <= n; i++) if (i != r) {
// f[i][j] - delta * f[r][j] = 0
i64 delta = f[i][j] * ksm(f[r][j], MOD - 2) % MOD;
for (int k = 1; k <= n; k++) {
f[i][k] = (f[i][k] - f[r][k] * delta % MOD + MOD) % MOD;
}
v[i] = (v[i] - v[r] * delta % MOD + MOD) % MOD;
}
r++;
}
r--;
for (int i = 1; i <= n; i++) {
v[i] = (v[i] * ksm(f[i][i], MOD - 2)) % MOD;
f[i][i] = 1;
}
std::cout << v[1] << "\n";
高斯约旦消元法
对于 \(n \times n\) 的线性方程组,它的增广矩阵是 \(F | V\) 。
- 按列消元。枚举 \(j = 1 \to n\) 。
- 初始 \(r = 1\) 。假设第 \(r\) 行可以消元。
- 找任意一个 \(\forall i \in [r + 1, n], F_{i, j} \neq 0\) 。将 \(F, V\) 的 \(r\) 行和 \(i\) 行交换。
- 不存在则 \(r\) 不增加,列 \(j\) 增加。在下一列重复找 \(\forall i \in [r + 1, n], F_{i, j} \neq 0\) ,直到找到。
- 对 $\forall, i \in [1, r - 1] \cup [r + 1, n] $ 行消元。\(F, V\) 的第 \(i\) 行减去“第 \(r\) 行乘以系数 \(\delta = \frac{F_{i, j}}{F_{r, j}}\) ” 。
- 每个列结束后 \(r := r + 1\) 。所有列结束后再 \(execute\) 一次 \(r := r - 1\) 。
- 最后 \(r\) 是矩阵的秩。如果满秩,会得到 \(n\) 个一元一次方程,然后容易计算每个元。
5.3.4 朴素的需要转化状态空间的随机游走
5.3.4.1 代码源:瓜子(转化状态空间 + 期望线性性 + 多终点)
小L 买了 \(n\) 粒瓜子。
小 L 每次都会从这堆瓜子中挑出一粒,他每次吃完一粒瓜子后,就会得到两瓣瓜子壳,他会把瓜子壳也丢进瓜子堆里面去。
如果他拿到了自己之前吃瓜子留下的瓜子壳,他就会把拿到的瓜子壳丢掉,否则就吃掉拿到的瓜子并且把瓜子壳丢进去。
现在设每次小 L 拿到每一粒瓜子或者是瓜子壳的概率是均等的,问小 L 期望多少次能够把瓜子拿完。
\(1 \leq n \leq 2 \times 10^{3}, MOD = 998244353\) 。
solution
首先不用在乎瓜子壳被丢出瓜子堆会对期望计算产生什么影响。因为期望具有线性性,所以没有影响。
设置状态 \(f[i][j]\) 为瓜子堆中有 \(i\) 粒瓜子,\(j\) 瓣瓜子壳的期望。显然 \(i = 0\) 是终点且 \(\forall j, 0 \leq j \leq 2n, f[0][j] = 1\) 。
严格注意在终点状态 \(i = 0\) 时, \(\forall j, 0 \leq j \leq 2n, f[0][j]\) 在状态空间中是不连通的,于是不能让 \(i = 0\) 之间互相递推。另一个理解是,已经被确定的终点不能再被递推。
由马尔可夫链
显然无环。
从 \(i = 0\) 往外发散递推即可。若使用归纳的向内递推,\(i\) 从 \(1\) 开始枚举(\(i = 0\) 之间的状态是不连通的)。
int n; std::cin >> n;
std::vector<int> f(2 * n + 1), g(2 * n + 1);
for (int i = 0; i <= 2 * n; i++) f[i] = 0;
// f[i][j] -> i / (i + j) * (f[i - 1][j + 2] + 1) + j / (i + j) * (f[i][j - 1] + 1)
std::vector<i64> inv(3 * n + 1);
for (int i = 1; i <= 3 * n; i++)
inv[i] = ksm(i, MOD - 2);
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= 2 * n; j++) {
if (i - 1 >= 0 && j + 2 <= 2 * n)
g[j] = (g[j] + i * inv[i + j] % MOD * (f[j + 2] + 1) % MOD) % MOD;
if (j - 1 >= 0) {
g[j] = (g[j] + j * inv[i + j] % MOD * (g[j - 1] + 1) % MOD) % MOD;
}
}
f = g;
g.assign(2 * n + 1, 0);
}
std::cout << f[0] << "\n";
值域不大,逆元在这里可以被 \(O(n \log n)\) 预处理。空间可以使用滚动数组从 \(O(n^{2})\) 优化到 \(O(n)\) 。时间复杂度瓶颈为 DP 的 \(O(n^{2})\) 。
5.3.4.2 JSCPC 2023 :炼金术士(转化状态空间 + 特定情况时存在自环)
https://codeforces.com/gym/104396/problem/F F. Timaeus
Timaeus, a budding alchemist in Mondstadt, has been tasked by his mentor, Albedo, to synthesize a specific type of alchemical product: Large Sweet Flowers. However, due to his limited skills, Timaeus can only create one Large Sweet Flower by combining \(B\) Regular Sweet Flowers in a single synthesis. Therefore, he has enlisted the assistance of two helpers: Sato and Mona.
Sato has a knack for increasing productivity, with a probability \(P\%\) of producing twice the output during a single synthesis, which means to produce two Large Sweet Flowers by combining \(B\) Regular Sweet Flowers in a single synthesis. On the other hand, Mona has a knack for resource conservation, with a probability \(Q\%\) of retrieving one Regular Sweet Flower during the process, which means to produce one Large Sweet Flower and simultaneously recover one Regular Sweet Flower by combining \(B\) Regular Sweet Flowers in a single synthesis. However, Timaeus can only choose one assistant for each synthesis.
Starting with a total of \(A\) Regular Sweet Flowers, Timaeus aims to maximize the expected number of Large Sweet Flowers he can produce. Therefore, he must optimally choose between assistants Sato and Mona for each synthesis. Please calculate the maximum expected number of Large Sweet Flowers he can produce.
\(1 \leq B \leq A \leq 10^{6}, 0 \leq P, Q < 100\)
精度误差不低于 \(10^{-9}\) 。
soluton
这题稍微有些反常规套路,另外又加了其他一些小套路。但本质也属于简单。属于很优质的一类题。
初始给定 \(A\) 朵甜花,询问最终能合成的大甜花的最大期望。
这时候设 \(f[i]\) 为剩余 \(i\) 多甜花时,能合成的大甜花的最大期望。这里 \(A\) 是终点,有 \(f[A] = 0\) 。
这里的状态空间可以进行选择转移:
- \(B\) 朵普通甜花合成 \(1\) 朵大甜花。
- 选择 \(P\%\) 的概率 \(B\) 朵普通甜花合成两朵大甜花。
- 选择 \(Q\%\) 的概率 \(B\) 朵普通甜花合成一个大甜花并返还 \(1\) 朵普通甜花。
这里显然是两个转移路径:
- \(f[i] = \frac{P}{100} \times (f[i - B] - 2) + \frac{100 - P}{100} \times (f[i - B] - 1)\)
- \(f[i] = \frac{Q}{100} \times (f[i - B + 1] - 1) + \frac{100 - Q}{100} \times (f[i - B] - 1)\)
这里直观上的方程是从终点到起点发散的,在发散路径很多的时候很难转移。
改写成终点到起点归纳。
- \(f[i] = \frac{P}{100} \times (f[i + B] + 2) + \frac{100 - P}{100} \times (f[i + B] + 1)\)
- \(f[i] = \frac{Q}{100} \times (f[i + B - 1] + 1) + \frac{100 - Q}{100} \times (f[i + B] + 1)\)
当 \(B > 1\) 时显然无环,可以归纳为
当 \(B = 1\) 时,至少方程 \(f[i] = \frac{Q}{100} \times (f[i + B - 1] - 1) + \frac{100 - Q}{100} \times (f[i + B] - 1)\) 存在一个自环。
当自环存在时,期望问题可以使用类似计算抽卡模型的期望方式处理掉自环。
概率问题下的自环,大多情况下可以不选择这条路径。
再否则存在环但非自环的概率期望问题,大概率只能高斯消元。
const db EPS = 1E-12;
inline int sgn(db x) { return x <= -EPS ? -1 : (x >= EPS); }
void solve() {
int A, B, P, Q; std::cin >> A >> B >> P >> Q;
std::vector<long double> f(A + 1);
f[A] = 0;
for (int i = A - B; i >= 0; --i) {
db PA = (1.L * P / 100) * (f[i + B] + 2) + (1 - 1.L * P / 100) * (f[i + B] + 1);
db PB = 0;
if (B == 1) PB = (Q + (100 - Q) * (f[i + 1] + 1)) / (100.L - Q);
else PB = (1.L * Q / 100) * (f[i + B - 1] + 1) + (1 - 1.L * Q / 100) * (f[i + B] + 1);
if (sgn(PA - f[i]) == 1) f[i] = PA;
if (sgn(PB - f[i]) == 1) f[i] = PB;
}
std::cout << std::fixed << std::setprecision(12) << f[0] << "\n";
}
注意精度限制下的比较符,一个通用的方法是使用邻域,但不具备相等的传递性。
时间复杂度 \(O(A)\) 。
5.3.5 需要注意力的轴上对称随机游走
注意力: 最开始给的两道随机游走的经典例题:“回家”概率或期望,都是不借助马尔可夫链进行 DP 或 消元 。而是通过题目给定的一些特定信息,找到更快的解题方法。下面两道例题也是如此。
2024 ICPC 牛客多校第 10 场 H All-in at the Pre-flop
链接:https://ac.nowcoder.com/acm/contest/81605/H
来源:牛客网
In the backroom of the "All-in at the Pre-flop" casino, a crowd gathers nightly to witness a high-stakes duel that strips Texas Hold'em down to its rawest form of luck. Two players, known only by their monikers "Antileaf" and "Despradotwo", have become the main attraction. This evening, they bring their chips and a fierce desire to outlast the other, betting everything they have at the pre-flop stage in a daring display of brinkmanship. The crowd watches, mesmerized by the simplicity and intensity of the game where strategy is absent, and fortune rules. The entire pot goes to the winner, and the loser must leave with nothing.
In a simplified version of Texas Hold'em poker, two players face off in a duel where strategy is replaced by sheer luck. Each player starts with a fixed number of chips: the first player has \(a\) chips and the second player has \(b\) chips. In each game round, two players go all-in before even seeing the hole cards. After that, all community cards are dealt only once. Since nothing will change when the round is a tie, we assume that no tie happens, and the first player wins with probability \(\frac{1}{2}\) independently as it's a fair game. The round concludes as follows:
- If the winner in the round has at least the chips the loser has, the game ends and the winner takes all the chips.
- Otherwise, the loser pays the same amount of chips as the winner has, and another round starts afterwards.
You want to know the probabilities of each player winning the game (taking all the chips) under these conditions.
\(1 \leq a, b \leq 10^{9}\)
soluton
问题最终的朴素描述容易被抽象成一个几何模型:在一根 \(0 \sim a + b\) 的数轴上,起始点将数轴分为左边为 \(a\) ,右边为 \(b\) 的两段轴。
总轴长恒为 \(a + b\) 情况下。
- 每次有 \(\frac{1}{2}\) 的概率左边的轴长度乘以 \(2\) ,右边的轴相应缩短。
- 每次有 \(\frac{1}{2}\) 的概率右边的轴长度乘以 \(2\) ,左边的轴相应缩短。
- 起始点跳到 \(0\) 或 \(n\) 结束。
进一步将几何模型转数学模型,设右端点为 \(n\) :在一根 \(0 \sim n\) 的数轴上,起始点在 \(x\) 。
- 每次有 \(\frac{1}{2}\) 的概率 \(x = 2x\) 。
- 每次有 \(\frac{1}{2}\) 的概率 \(x = 2x - n\) 。
- 起始点跳到 \(0\) 或 \(n\) 结束。
已知问题询问,起始点跳到 \(\leq 0\) 的概率 \(p_1\) 和 \(\geq n\) 的概率 \(p_2\) 分别是多少。
设 \(f(i)\) 为从 \(i\) 开始跳到 \(\geq n\) 的概率。
显然有 \(f(0) = 0, f(n) = 1\) 。
然后有:
- \(1 \leq i \leq \lfloor \frac{n}{2} \rfloor, f(i) = \frac{1}{2} f(0) + \frac{1}{2} f(2i)\) .
- \(\lfloor \frac{n}{2} \rfloor < i < n, f(i) = \frac{1}{2} f(2i - n) + \frac{1}{2} f(n)\) .
首先递推式成环。其次似乎不容易找到通项公式。
不妨直接观察增广矩阵。
它的线性方程组的矩阵形式为 \(n + 1\) 阶,增广矩阵如下:
显然线性方程组满秩。
\(n\) 非常大,通过消元方法解决也几乎不可能。
官方题解中说:容易观察到答案为 \(f(x) = \frac{x}{n}\) !这似乎确实容易观察到……
另一个答案怎么算?设 \(g(x)\) 为到达 \(n\) 的概率。设置换 \(h\) 为 \(x = n - x\) 。
不难发现 \(h \circ f = g\) ,于是 \(g(n - x) = f(x) = \frac{x}{n} \Leftrightarrow g(x) = f(n - x) = \frac{n - x}{n} = 1 - \frac{x}{n}\) 。
5.3.6 需要注意力的图上对称随机游走
2023 ICPC 牛客多校第 1 场 J Roulette
链接:https://ac.nowcoder.com/acm/contest/57355/J
来源:牛客网
Walk Alone is playing roulette, a kind of gambling. For simplification, we assume its rules and steps as follows:
- The whole gambling process composes of many turns.
- In the \(i\)-th turn:
- Walk Alone can choose an integer \(x_i\) and pay \(x_i\) yuan as the wager.
- If Walk Alone wins, he will get \(2 x_i\) yuan from the maker, which means he gains \(x_i\) yuan in this turn. Otherwise, the maker will devour the \(x_i\) yuan he has paid, which means he loses \(x_i\) yuan in this turn. The probability that Walk Alone wins is \(0.5\) .
Walk Alone has \(n\) yuan initially, and he wants to earn an extra \(m\) yuan. He will use the following strategy to gamble:
- In the first turn, Walk Alone pays \(1\) yuan as the wager, i.e., \(x_1 = 1\) .
- If Walk Alone wins in the \((i - 1)\)-th turn, then \(x_i = 1\). Otherwise, \(x_i = 2 x_{i - 1}\) .
- At the beginning of each turn, if Walk Alone has at least \((n + m)\) yuan, then he gets satisfied and quits the game. Otherwise, he must pay \(x_i\) yuan as the wager, and he will have to stop gambling if he has less than \(x_i\) yuan.
Walk Alone's good friend, Kelin wants to exhort him not to gamble. Tell him the probability that he successfully earns an extra \(m\) yuan.
\(1 \leq m, n \leq 10^{9}, MOD = 998244353\)
soluton
马尔可夫链?
从马尔可夫链的角度去看,可以有状态 \(f[i][j]\) ,当前有钱共 \(i\) ,已经连续输了 \(j\) 次。可以设计状态转移,回答 \(f[n + m][0]\) 。
这显然是时空都不能接受的。
注意到:
- 类似二进制的表示,一定是 “输输……输输赢” 为一个周期,可以赢得一块钱。
- 假设当前有钱 \(x\) ,最多连输 \(r\) 次,第 \(r + 1\) 次赢。\(r\) 是 \(2^{r + 1} - 1 \leq x\) 的最大值,即 \(r = \lfloor \log_{2} (x + 1) \rfloor - 1\) 。
定义事件 \(x\) 为“从钱 \(x\) 赚到 \(x + 1\) ” ,考虑当前可以从钱 \(x\) 到达钱 \(x + 1\) 的概率。
可以直接考虑连输了 \(i = 0, 1, 2, \cdots, r\) 次,第 \(i + 1\) 次赢了的概率之和:
这好算吗?戈门?这不好算。事件“连输了 \(i = 0, 1, 2, \cdots, r\) 次,第 \(i + 1\) 次赢了”,等于样本空间中的所有事件减去“连输了 \(r + 1\) ”的这一事件(输到离开赌局的事件),显然
总之,可以 \(O(1)\) 算出。
注意到两个事件“从 \(k\) 赚到 \(k + 1\) 元”和“从 \(k + 1\) 赚到 \(k + 2\) 元”是独立的, 则最终答案是
目前是 \(O(n + m)\) 的复杂度。
不难注意到 \([n +1, n + m]\) 中,\(p = r + 1 = \log_2 i\) 一定是分段连续相同的。由于 \(p\) 每次要么不变,要么 \(p := p \times 2\) ,这些段只会有 \(O(\log n)\) 段。
可以使用类似数论分块的处理,当前枚举到 \(L\) ,获得 \(r = \lfloor \log_2 L \rfloor\) ,则 \(R = min(2^{r + 1} - 1, n + m)\) 。
i64 n, m; std::cin >> n >> m;
i64 ans = 1;
for (i64 L = n + 1; L <= n + m; L++) {
int pw = 31 - __builtin_clz(L);
i64 R = std::min<i64>( (1LL << pw + 1) - 1, n + m);
i64 cur = (1 - ksm(ksm(2, pw), MOD - 2) + MOD) % MOD;
ans = (ans * ksm(cur, R - L + 1)) % MOD;
assert(L <= R);
L = R;
}
std::cout << ans << "\n";
考虑进计算逆元的复杂度,该问题可以在时间复杂度 \(O(\log^{2} (n + m))\) 内解决。
5.3.7 看起来像是马尔可夫链的题
在 \(D\) 维正交坐标系上。给定起始点 \(s\) ,给定终点 \(t\) 。
从原点开始随机游走,询问花费完 \(N\) 步时,会到达终点的概率。
5.3.7.1 问题解析
这个问题可以抽象成高维正交空间,然后抽象成一维有界图。
假设 \(D = 2\) 。
问 1: 可以直接按照马尔可夫链的方式 DP 吗?
答 1: 不能。因为问题询问的是花费完 \(N\) 步时,会到达终点的概率。
- 如果是一道马尔可夫链的题,会只问从起点到达终点的概率。
问 2: 那应该怎么求解?
答 2: 只是个普通 DP ,dp[花费了 \(i\) 步][第一维走到了 \(x\) ][第二维走到了 \(y\)] 的概率。只纪录有效空间,时间复杂度时间上会达到 \(O(N^{3})\) 。
问 3 : 如果是个对称概率的游走,还有其他做法吗?
答 3: 首先如果是个对称概率的游走,那么严格走 \(N\) 步的样本空间实际上等价于一个随机取球(放回)的模型。每一维都有黑白两种球对应向前或向后。
- 问题已经转化为组合模型了,当然可以 DP 最终能走到终点的方案数。
- 不妨考虑分解每一维,枚举当前维一共会花费的步数 \(K\) 。假设向前 \(A\) 步,向后 \(B\) 步,则有 \(A + B = K\) ,\(A - B = X\) ,线性方程组可解出 \(A, B\) 。于是每一维只需 \(O(1)\) 求 \(A, B\) 的组合数。
- 复杂度瓶颈在于组合数的预处理和维度的分解,前者 \(O(N)\) ,后者 \(O(N^{2})\) 。
原题出处: AtCoder Beginner Contest 011 D - 大ジャンプ
先不妨定义随机事件“第 \(N\) 步能走到终点”为 \(\mathbb{A}\) 。
一维怎么处理?不妨设起点为 \(s = 0\) (否则让正交坐标系平移),不妨让终点为 \(t = X (X \geq 0)\) (否则让正交坐标系旋转)。每次等概率往右或往左走一步。询问走完 \(N\) 步时能到达 \(t\) 的概率。
首先一个观察是,问题要继续考虑,至少要满足两个性质:
\(X\) 显然不能在 \(N\) 不可达的地方。在正交坐标系下的同一个坐标上,不同 \(N\) 之间的差值只能是 \(2\) 的倍数。
假设向右走了 \(A\) 步,向左走了 \(B\) 步。那么 \(A + B = N, A - B = X\) 线性方程组满秩,不难解得 \(A = \frac{N + X}{2}, B = \frac{N - X}{2}\) 。
所以只需要选出 \(N\) 步中哪些步向左哪些步向右,就能得到前 \(N - 1\) 步走不到终点而第 \(N\) 步走到终点的方案数。花费 \(N\) 步时走到终点的概率为 \(\frac{\binom{N}{(N + X) / 2}}{2^{N}}\) 。
二维怎么处理?不妨设起点为 \(s = (0, 0)\) ,不妨设终点为 \(t = (X, Y) \ s.t. \ 0 \leq X, Y\) 。每次等概率往右、左、上或下走一步。询问走完 \(N\) 步时能到达 \(t\) 的概率。
显然首先要满足
然后枚举 \(K(0 \leq K \leq N)\) 表示在第一维上走的步数,然后从 \(N\) 次中选出来。
假设向右 \(A\) 步,向左走 \(B\) 步。根据那么 \(A + B = N, A - B = X\) 有唯一解 \(A = \frac{K + X}{2}, B = \frac{K - X}{2}\) 。这一维在 \(N\) 步后能走到 \(X\) 的概率是 \(\mathcal{P}(\mathbb{A}) = \frac{\binom{K}{(K + X) / 2}}{2^{N}}\) 。
第二维也是类似的做法,这一维在走 \(N\) 步后能走到 \(Y\) 的概率是 \(\frac{\binom{(N - K)}{((N - K) + Y) / 2}}{2^{N}}\) 。和第一维独立。
最终第 \(N\) 步能走到 \((X, Y)\) 的概率是所有情况的概率之和,一个显然不独立下的加法原理:
时间复杂度 \(O(N)\) 。
三维怎么处理?不妨设起点为 \(s = (0, 0, 0)\) ,不妨设终点为 \(t = (X, Y, Z) \ s.t. \ 0 \leq X, Y, Z\) 。每次对称概率往六个方向右、左、前、后、上或下走一步。询问第 \(N\) 步能到达 \(t\) 的概率。
更高维怎么处理?类似的可以扩展到高维,但转化成马尔可夫链后会发现本质依旧是一维边界对称随机游走。
5.3.7.2 考虑另一个问题
在 \(D\) 维正交坐标系上。给定起始点 \(s\) ,给定终点 \(t\) 。
从原点开始随机游走,询问花费不超过 \(N\) 步,会到达终点的概率。
假设 \(D = 2\) 。
问 1: 是不是也可以维护 dp[走了不超过 \(i\) 步][第一维走到 \(x\)][第二维走到 \(y\)] 能走到终点的概率?
答 1: 显然可以直接维护,转移也很典型。
问 2: 如果是对称的游走呢?有其他解决办法吗?
答 2: 如果是对称游走,对某个固定步数 \(N\) ,可以视为随机取 \(N\) 个球的模型(放回)。
- 但如果是 \(\leq N\) 的步数,需要分解为 \(1, 2, \cots, N\) 的取球模型,显然这种似乎分解更复杂了。
- 如果可以快速容斥,上述分解的复杂度几乎可以忽略。很遗憾如果考虑容斥,那么对立状态就是“到不了终点的状态”,这些状态数量更多。显然不能快速容斥了。
- 所以直接 DP 就已经是一种高效的办法。
5.3.8 树上随机游走
5.3.8.1 小清新题
2023 牛客多校 10 https://ac.nowcoder.com/acm/contest/57364/K
题意
\(n\) 个人在玩一场雀魂,大家实力一样,游戏结束后你的排名是随机的。询问连续 \(m\) 场雀魂,你每次的结果都是第一名或最后一名的概率。
题解
特判 \(n = 1\) 第一名等于最后一名的情况。否则根据每次游戏独立可以秒了这题 \(\left ( \frac{\mathbf{min}(n, 2)}{n} \right )^{m}\) 。
Code
int n, m; std::cin >> n >> m;
if (n == 1) {
std::cout << 1 << "\n";
} else {
// (\frac{2}{n})^{m}
std::cout << std::fixed << std::setprecision(12) << std::pow(2.L / n, m) << "\n";
}
如果强制从随机游走的角度考虑呢?假设我们不知道上面这个性质,另一个可选的方法是从随机游走角度考虑。
这里再引入一种树上随机游走的角度考虑问题的方式。
将问题视为一棵二叉树,红色节点有 \(\frac{2}{n}\) 的概率到达,蓝色节点有 \(1 - \frac{2}{n}\) 的概率到达。
- 问题可以看成不独立的,即连续 \(m\) 次往左节点走的概率。为 \(\left ( \frac{\mathbf{min}(n, 2)}{n} \right )^{m}\) 。
- 问题也可以看成独立的,即第 \(i\) 层红色节点出现的概率。为 \(\frac{\mathbf{min(n, 2)}^{i}}{n^{i}} = \left ( \frac{\mathbf{min}(n, 2)}{n} \right )^{i}\) 。
更朴素地,将问题视为一棵 \(n\) 叉树,每个点有 \(\frac{1}{n}\) 的概率到达。每个分叉节点单独分配 \(n\) 种颜色种的一种颜色,第 \(i\) 层红蓝节点出现的概率:
- 问题可以看成不独立,即连续 \(m\) 次红蓝节点之间走的概率。朴素计算需要维护树链前缀,枚举当前节点继续分叉。有一个取巧的办法是把这个问题根据分层看成一个 \(0, 1\) 序列,\(0\) 表示走到红或蓝节点,于是问题独立。
- 问题可以看成独立,即第 \(m\) 层红蓝节点出现的概率。这依旧好算,因为第 \(i\) 层红蓝节点出现的概率为\[\frac{\mathbf{min(n, 2)}^{i}}{n^{i}} = \left ( \frac{\mathbf{min}(n, 2)}{n} \right )^{i} \]
问题的思路:
-
取巧地将 \(n\) 叉树转成 \(2\) 叉树是方便计算不独立的概率的。
-
取巧地按 \(n\) 叉树的树层转化成其他模型也是容易将不独立的概率模型转成独立概率模型的。
-
但是最本质的视角是:随机前提下,每层每个节点的地位等价,每层直接节点也显然独立。
视角的正确性很多时候会优于技巧的积累。很多情况下问题变形后会让大量可以处理原模型的技巧失效。
5.3.8.2 有点意思题
题意
给 \(n\) 个长度为 \(m\) 的字符串,字符等概率属于 \(a \sim z\) 的一个。将它们插入字典树。
询问字典树最大节点数和期望节点数。
题解
最大节点数:
逐层考虑。\(n\) 个字符串的每一位,在没有限制的情况下最多开 \(n\) 个节点。
于是在 \(26\) 叉字典树中的第 \(i\) 层最多开 \(\mathbf{min}(26^{i}, n)\) 个节点。
整棵树的最大节点数为
期望节点数:
根据期望的线性性,整棵字典树的期望等于每层的期望之和。
考虑某层不妨是第 \(i\) 层的期望,根据期望的线性性这层的期望可以等于这层每个节点的期望之和。
又一层中每个节点的地位是等价的,于是一层的期望为
\(E(Y)\) 是这层某个节点的出现期望, \(\mathcal{P}(\mathbb{A})\) 是这层某个节点出现的概率。(目前为止都容易考虑。)
注意到: 字典树每层之间的节点看似不独立,但在随机概率下层与层之间是独立的,所以当前层的概率不需要依赖于上一层。
考虑一层中一个节点可以出现的概率。若 \(n = 1\) ,显然是 \(\frac{1}{26^{i}}\) 。若 \(n \geq 2\) ,则是 \(\binom{n}{k}, k \in [0, n]\) 个字符使这个节点出现的概率之和。(我们当时只注意到了这里)
注意到: 出现的概率是或运算,不出现的概率是与运算。
于是可以考虑容斥,一个节点不出现的概率是 \((1 - \frac{1}{26^{i}})^{n}\) 。于是 \(\mathcal{P}(A) = 1 - (1 - \frac{1}{26^{i}})^{n}\) 。
于是期望节点数为 (字典树第 \(0\) 层恒有一个根)
Code
5.3.9 抽卡模型
5.3.9.1 2023 ICPC 网络赛第二场 I Impatient Patient
章节的开头我们以这题为例子讲述了抽卡模型。
一个经典的考虑:要么使用方案,要么不使用方案。(或许这在生活中过于显然以至于不重要,但需要强调的是这非常重要)
-
不使用方案肯定是自然恢复,问题容易解决。
-
使用方案呢?需要进行一些观察。
这个问题中,容易观察到在超过一个位置使用方案是没有意义的。
- 假设将在 \(A, B\) 使用方案,如果它们互相不可达,那么显然只有一个位置有意义。
- 如果 \(A, B\) 可达。即在 \(A\) 使用方案可达 \(B\) ,并继续在 \(B\) 使用方案。这显然不优于一开始就在 \(B\) 使用方案。
所以如果使用方案,一定只有一个点可以使用方案。于是可以枚举在 \(i \in [1, n]\) 使用方案的情况。
于是只需要 \(O(n)\) 对比 \(n\) 次使用方案和不使用方案的朴素过程,即可得到最终答案。
5.3.9.2 2024 ICPC 网络赛第二场 L 502 Bad Gateway
题意
初始在 \([1, n]\) 随机一个点 \(t\) ,每秒 \(t\) 会自然减少 \(1\) ,或者这一秒可以选择 \(t\) 重新在 \([1, n]\) 中随机。询问最优操作下 \(t\) 到 \(0\) 的最小时间期望。
题解
设 \(E(X)\) 为"随机 \([1, n]\) 中一个数,经过最优操作可以到达原点的期望时间”。根据期望线性性,\(E(X) = \sum_{i = 1}^{n} E(Y_i)\) ,\(E(Y_i)\) 表示从 \(i\) 点经过最优操作可以到达原点的时间。
考虑每个点 \(i\) 的状态,首先这个点有 \(\frac{1}{n}\) 的概率被随机到。
- 要么花费 \(i\) 秒走到 \(0\) ,这么做的期望是 \(i\) 。
- 要么花费 \(1\) 秒随机成 \([1, n]\) 中一个数,这么做的期望是 \(1 + E(X)\) 。
于是有
由 \(i\) 是单调递增,存在一个 \(v\) ,使
不难证明(比如反证)一个宽松的的界限是 \(v \in [1, n]\) ,于是
如果 \(E(X)\) 满足最优性一定最小,显然它是对勾函数,且在 \(v \in [1, n]\) 中是单谷,可以 \(\log n\) 三分 \(v\) 得到 \(E(X)\) 。
或者可以不三分,求导可以发现在 \([1, n]\) 中极值点取 \(v = \sqrt{2n}\) ,判断上下取整的两个点即可。
5.3.10 需要点注意力的概率期望杂题
2024 ICPC 网络赛第二场 G https://codeforces.com/gym/105358/problem/G
6. 堆砌一些概率期望链接(备忘)
然后基本都是多校题……
可以看出今年的牛客多校比去年的多出了不少概率期望题,不可做题的这类题也更多。
下面都是一些可做题。这里就补只说明 23 年的两道。(因为今年的留到后面补卷子,去年的有时间可能要很晚补了)
https://ac.nowcoder.com/acm/contest/57364/K First Last
https://ac.nowcoder.com/acm/contest/57355/J Roulette
https://ac.nowcoder.com/acm/contest/81600/C 骰
https://ac.nowcoder.com/acm/contest/81600/M 不知(这是一道只用到了简单数学内容的出线题,其实是数学题)
https://ac.nowcoder.com/acm/contest/81599/J Zero
https://ac.nowcoder.com/acm/contest/81598/E Malfunctioning Typewriter
https://ac.nowcoder.com/acm/contest/81598/F MMR Double Down Tokens(这是一道只用到了简单数学内容的出线题,其实是数学题)