简单+典型的概率期望
0. Preface
- 比较简单说明的是:
- 不会涉及到贝叶斯公式、多项式之类的工具。
- 不会涉及到比较复杂的问题。比如某些概率或期望题算起来需要很多的数学技巧积累,这里并不进行这种积累。
- 比较典型是字面意思。
1. 万物之始:抽卡模型(几何分布模型)
你有
直觉上期望是
设抽到卡的期望次数为
方法一:
根据期望的定义:“随机变量的所有可能取值
这里抽卡次数可以作为随机变量。
- 有
的概率可以 次抽到卡。 - 有
的概率可以前 次抽不到卡,第 次抽到卡。 - 有
的概率可以前 次抽不到卡, 次抽到卡。 - ...
这也叫做几何分布模型,即前
于是可以计算期望
这不好算。当然,这是可算的。
另外,几何分布模型的结论说明了这个数值是
方法二:
将期望代入随机变量,将几何分布模型转为 0-1 分布模型,从而直接解出期望方程。
- 有
的概率可以 次抽到卡 - 有
的概率可以 次抽到卡
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
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
Now, you are wondering what the expected time required for your recovery would be, assuming you adopt the best strategy.
solution
要么选择修养,要选择挑战。
-
如果选择修养,第
个点的恢复时间期望是 。 -
如果选择挑战,容易观察到对
个点选择挑战是显然不优的。
接下来只需计算在每个点在选择挑战条件下每个点的恢复时间期望。
设第
显然
对于
则
于是
2. 离散概率论的一些基本概念
下面内容不保证适用于连续概率的情况,
2.1 随机试验
符合以下三个特点的叫随机试验:
- 在相同条件下重复进行
- 能明确试验的所有可能结果,且这些结果不止一个
- 每次试验前不知道哪个结果会出现
符合随机试验的例子
- 抛一枚硬币,观察出现的是正面还是反面
- 观察某地某天的最高气温。(这是个特殊的例子,因为我们已经知道节气是有规律的)
不符合随机试验的例子
- 一名在役的 ICPC 程序设计竞赛学生,观察某天中午几点吃饭。
一个随机试验可以由多个随机试验组成
比如掷两枚骰子,观测这两枚骰子正面朝上的点数之和。等价于分两次掷一枚骰子,观测骰子正面朝上的点数。再合并两个随机试验的结果。
2.2 样本空间
样本空间:一个随机试验的所有可能结果的集合。通常用
样本点(样本):随机实验中每个可能的结果,样本空间中的基本元素。
一个随机试验根据观测对象的不同,可能存在多个样本空间。
- 一个长度为
的随机排列的- 所有可能的全排列结果,它的样本空间是
。显然 。 - 所有可能前
位排列结果,它的样本空间是 。显然 。
- 所有可能的全排列结果,它的样本空间是
- 一副去除了 Joker 的
张扑克牌中随机抽出一张- 所有可能的数字,它的样本空间是
。 - 所有可能的花色,它的样本空间是
。
- 所有可能的数字,它的样本空间是
2.3 随机事件
随机事件(有时简称事件),是一个样本空间的子集,也是若干样本点的集合。
2.3.1 基本事件
基本事件是一个大小为
2.3.2 独立事件
事件
事件
2.3.3 互斥事件(不独立事件)
事件
最常见的用处是:若事件
则有概率关系
2.4 随机变量
2.4.1 随机变量是一种数学概念,用来表示随机试验结果的变量
详细地说,对于一个随机试验。若它的样本空间为
以掷一枚骰子观测正面朝上的点数的随机试验为例,样本空间为
一个随机试验的随机变量,有时也可以通过多个随机变量表示。
2.4.2 一个随机变量可以是多个随机变量的和
例如,随机试验一:掷两枚骰子,观测这两枚骰子正面朝上的点数之和,设随机变量为
随机试验二:掷一枚骰子,观测这枚骰子正面朝上的点数,设随机变量为
随机试验三:掷一枚骰子,观测这枚骰子正面朝上的点数,设随机变量为
显然有
2.4.3 随机变量可以是多维向量
如对地面抛钢球,观测落点的坐标,此时随机变量
2.5 有限概率
对于事件
计算概率的第一种方法是检验所有样本点。以
- 比如
是一个 的全排列的所有可能,那么 的时间也需要 。于是这种方式计算概率的时间复杂度为 。
计算概率的第二种方法是利用组合计数法。只需快速计数出
- 计数
的时间通常显然是 的。 - 计算概率的时间复杂度,依赖于设计的组合计数法对
计算的时间复杂度。
例:随机试验:
样本空间
事件
于是
可以通过改变随机试验的观测对象,缩小样本空间。
样本空间
同时事件
于是
2.6 数学期望
对于随机变量
其中
当随机变量是一维的时候,可以直观写成
期望计算的难度通常不在于时间,而在于随机变量的选取和划分。
2.6.1 期望的线性性
“两个(或多个)随机变量的和的期望”等于“两个(或多个)随机变量的期望的和”
解释: 随机变量本质上是定义在
重要程度:期望的线性性让不独立随机变量之间具备了期望的可加性。方便了期望的转移。
注:随机变量和随机实验是一一对应的,更详细的说,如果能将随机试验划分,那么“随机试验的结果的和期望”等于“随机试验的结果的期望的和”。
例如抽卡模型种:
- 抽卡次数的期望直观计算是一个收敛的无穷级数。
- 将随机变量划分为“是否抽到”与“是否没抽到”,则有
。
2.7 离散概率论中的转移
2.7.1 不独立的事件之间显然可以进行概率转移
起始事件的概率显然为
若事件
若事件
2.7.2 同一个随机变量的取值之间可以进行转移
终点取值的期望显然为
若取值
若取值
2.7.3 基于期望的线性性,任意随机变量之间显然可以进行期望“转移”
若
3. 离散概率的常见性质与练习
3.1 简单例题 1
随机一个长度为
设
组合计数法
观测目光放在整个排列。
样本空间的大小显然是
第
前
后
于是
继续化简比较困难,直接计算的复杂度是
优化观测对象
观测对象只需要放在前
样本空间的大小显然为
事件的大小。只需从
那么有
比较显然了,时间复杂度
对称性
考虑全排列的任意两个位置
考虑全排列的任意
注意到位置经过捆绑之后,位置的对称性显然失效。这是因为捆绑位置并没有使样本空间变小,只是方便了随机事件的计数。
于是只考虑前
对于对称性,不难发现任意
3.2 简单例题 2
随机一个长度为
组合计数法
样本空间大小显然是
为了计数事件大小,需要将
在
3.3 简单例题 3
随机一个长度为
考虑到存在对称性,直接计算
没观察到对称性的话也可以直接组合计数。
组合计数法
显然可以将观测对象放到
样本空间大小为
使用耿直一些的笨方法,直接将观测对象作为整个排列也是可以的。
即样本空间大小为
事件大小为:
于是
3.4 简单例题 4
随机一个长度为
首先敏感地,
观测对象只能放到整个排列上,没有优化空间。
样本空间的大小是显然的
事件的大小,可以在
3.5 简单例题 5
随机一个长度为
观测对象可以直接放到
样本空间大小
事件是被钦定的一种基本事件,大小
所以
也可以使用耿直的方法,观测对象为整个排列。
样本空间大小为
事件为
3.6 简单例题 6
这是一个真正意义上的不那么入门的简单例题,套了一个 trick 。
给一个序列
3.6.1 trick 源
给一个排列
实际上是询问有多少对
证明:
顺序遍历
- 若
。则从 结尾,到第一个 满足 开始,的最长连续递减子序列,其中每个数都是一个以 为右端点的数对可以匹配的左端点。 - 若
。则从 结尾,到最后一个 满足 开始,的最长连续递减子序列,其中每个数都是一个以 为右端点的数对可以匹配的左端点。
这些数的个数是极大的。不难发现这个问题的极大就是最大。
实际上可以维护一个单调递减栈,对于新加入的
只需要再检查是否栈顶存在,若存在则栈顶元素
3.6.2 trick 源的某个扩展
给一个序列
实际上是询问有多少对
实际上依旧是维护单调非递减栈,依旧考虑统计所有
这时候需要多维护一个
若
然后考虑
- 若栈顶为空,则显然
不增加。 - 若栈顶非空,且栈顶元素
, 也只需要 即可。 - 若栈顶非空,且栈顶元素
,这时候分栈顶元素是否等于栈底元素讨论- 若栈顶元素等于栈底元素,则
。这是显然的。 - 若栈顶元素大于栈底元素,则
。当计算完相同元素的贡献,还要计算左边一个比它更大元素的贡献。
- 若栈顶元素等于栈底元素,则
更新栈底元素,更新
3.6.3 利用了 trick 的当前问题
知道这个 trick 后。我们回来看原问题:
给一个序列
实际上首先要做的事情是:随机删除元素即,随机一个时间戳的排列
可以将观测对象放到
样本空间显然是
那么只需要考虑
如果我们直接观测整个排列会发什么?
样本空间大小显然是
事件为
考虑
对于
然后是从
最后剩下的
所以
这一看上去就很难化简,不化简直接算的话需要
4. 期望的线性性练习
为了体现期望线性性的优越性,会先使用定义法,再使用线性性。
同时也因为一些比较复杂的问题,直观上只能使用定义法,需要经过一些转化才能具备线性性。
4.1 简单例题 1
箱子里有
直接枚举随机变量
直接枚举随机变量
期望取值是
考虑随机变量可以是多个随机变量的和。
随机变量
将
考虑如何计算
直接算的复杂度是
将
于是
say more thing
如果可以放回,每次拿是显然独立的,然后最终算出来的期望也是
4.2 简单例题 2
随机一个长度为
这里可以把随机变量
划分随机变量
于是
4.3 简单例题 3
随机一个长度为
同样可以将
4.4 简单例题 4
有
经典的随机变量划分,设随机变量的取值
对于事件第
4.5 简单例题 5(非常经典)
有
此题和前面题的区别是,随机变量的划分方式需要使用一个经典的 trick 。
考虑直接计算期望。
其中
时间复杂度
怎么利用期望的线性性计算?
或者说怎么把随机变量划分成一组性质良好的随机变量?
考虑
时间复杂度
4.6 简单例题 6
这个题是很符合竞赛风格的基础期望题。
设当前试验的随机变量是
事件“
期望计算的时间为
5. Random Walk 、马尔可夫链
5.1 马尔可夫链
一个有限状态空间中,一个状态转移到另一个状态的随机过程。
马尔可夫链可以看作一组无限长度的随机变量序列:
无记忆性:下一状态的概率分布只有当前状态决定
很多转移也具有无记忆性,但马尔可夫链模型的无记忆性需要被强调,这是个比较普适的模型。
状态出度的概率之和为 :显然当前状态分配给后续状态的概率之和只能为 。
研究马尔可夫链时,通常可以用一维上的简单边界随机游走模型处理。
竞赛中的解题思路:
一个好的解决思路是:
- 写出递推方程组
- 方程组能通过一些数学方法得到通项?
- 只是一个普通的 DP 而不是马尔可夫链?
- 是马尔可夫链?
- 将问题转化为马尔可夫链。
- 没环通常能直接 DP
- 否则要消元
5.2 Random Walk
一维简单边界随机游走
对称随机游走
对称随机游走与普通随机游走的区别是:对称随机游走中,从当前状态到下一状态的概率分布是相同的。
本质上依旧可以使用马尔可夫链 DP 的做法。
但有时候这类模型会将数据限制成不能 DP 。这时候通常容易写出状态转移矩阵,或者能直接对进行观察。
高维随机游走
-
比如二维随机游走可以看作是在无限微分的网格图上进行的马尔可夫过程,显然不容易通过普通的离散数学工具解决。
-
二维随机游走的解决方式比一维随机游走复杂许多,三维随机游走的解决方式极其复杂,四维以上随机游走在学术界中可以被证明有解但还未研究出解。
-
幸运的是当前很多常见的随机游走问题都可以抽象成有限状态空间上的一维简单边界随机游走。竞赛一类趋向于短时间表现的运动,基本不会涉及一维以上的随机游走。
5.3 常见的随机游走
5.3.1 经典轴上随机游走
5.3.1.1 回家问题 1 :回家概率
solution
设
首先一定有
对于
但是整个递推式方程组明显有环。
幸运的是递推式方程组是线性的,于是至少可以将它写成
线性方程组经过一些简单变换后,容易发现满秩,有唯一解。不难发现可以
还能更快吗?
注意到,对于
这说明整条链上的概率,构成一个等差数列。
数列中我们至少知道
然后求得通项:
say one more thing 1
一定要走到两个端点就停止吗?让问题变为走到
这样的话就不存在
显然满秩(至少主对角线可以连成)。
能不能更快?
可以注意到是等差数列,但公差
于是几乎只能进行消元,矩阵的特殊性使其可以进行
say one more thing 2
如果还需要求出计算走到
设
如果已知上文中的
与是有
5.3.1.2 回家问题 2 :回家期望
solution
设
对于
显然递推式成环。一个 naive 但有效的做法是观察增广矩阵:
显然是满秩的(至少主对角线连城一条线),至少可以高斯消元。
能更快吗?
注意到,对于
链上的期望的差值是等差的!
已知一个边界
say one more thing
如果问题改为,走到
依旧可以观察出差分递推,或者直接矩阵展开。
如果已经知道
然后有
5.3.1.3 酒鬼失足与赌徒破产
-
一个醉鬼行走在一头是悬崖的道路上,酒鬼从距离悬崖仅一步之遥的位置出发,向前一步或向后退一步的概率皆为
,问酒鬼失足掉入悬崖的概率是多少?问题等价于在
的数轴上,酒鬼开始在 ,每次有 的概率向左或向右,询问到达 的概率 是多少。显然是
。 -
赌徒在赌场赌博,和庄家玩公平游戏。赢的概率是
,输的概率 。假设赌徒最开始时有赌金 元,庄家本金 元。赢了赌金加 元,输了赌金减 元。问赌徒输光的概率是多少?问题等价于在
的数轴上,赌徒开始在 ,每次有 的概率向左或向右,询问到达 的概率 是多少。显然是
。当 , 。 -
赌徒在赌场赌博,和庄家玩不公平游戏。赢的概率是
,输的概率 。假设赌徒最开始时有赌金 元,庄家本金 元。赢了赌金加 元,输了赌金减 元。问赌徒输光的概率是多少?可以写出概率转移公式,然后写出线性方程组
。一个 naive 的办法是写出线性方程组然后进行消元,但是时间复杂度很高。
需要解决的话需要数学科班的知识。但可以预料到到只要庄家本金相交赌徒本金是无限多,则赌徒输的概率无限接近
。
5.3.2 有向图上随机游走
5.3.2.1 走路 1
蜗蜗的世界里有 n 个城市,城市之间通过 m 条单向高速公路连接,初始他在 1 号城市。蜗蜗想去 n 号城市游玩,假设现在他在 x 号城市,他会等概率地选择从 x 出发的高速公路中的一条走过去。如果没有任何从 x 号城里出发的高速公路,他就只能留在原地了。蜗蜗会一直走直到他无路可走。
请问蜗蜗有多大的概率能够走到 n 号城市。
solution
设置状态
由马尔可夫链,显然
显然无环。
枚举
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";
考虑逆元,时间复杂度
5.3.2.2 走路 2
蜗蜗的世界里有 n 个城市,城市之间通过 m 条单向高速公路连接,初始他在 1 号城市。蜗蜗想去 n 号城市游玩,假设现在他在 x 号城市,他会等概率地选择从 x 出发的高速公路中的一条走过去。如果没有任何从 x 号城里出发的高速公路,他就只能留在原地了。蜗蜗会一直走直到他无路可走。
请问蜗蜗期望多少步能够走到 n 号城市。
solution
设置状态
由马尔可夫链,显然
显然无环。
枚举
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";
考虑逆元,时间复杂度
5.3.3 无向图上随机游走
走路 PRO
蜗蜗的世界里有 n 个城市,城市之间通过 m 条单向高速公路连接,初始他在 1 号城市。蜗蜗想去 n 号城市游玩,假设现在他在 x 号城市,他会等概率地选择从 x 出发的高速公路中的一条走过去。如果没有任何从 x 号城里出发的高速公路,他就只能留在原地了。蜗蜗会一直走直到他无路可走。
请问蜗蜗期望多少步能够走到 n 号城市。
solution
注意到这题数据没有保证
大概率需要高斯消元。
由马尔可夫链,显然
于是有矩阵
设置状态
对于
整理得
共可以得到
考虑终点时候的
于是对
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";
高斯约旦消元法
对于
- 按列消元。枚举
。 - 初始
。假设第 行可以消元。- 找任意一个
。将 的 行和 行交换。 - 不存在则
不增加,列 增加。在下一列重复找 ,直到找到。
- 找任意一个
- 对
行消元。 的第 行减去“第 行乘以系数 ” 。 - 每个列结束后
。所有列结束后再 一次 。 - 最后
是矩阵的秩。如果满秩,会得到 个一元一次方程,然后容易计算每个元。
5.3.4 朴素的需要转化状态空间的随机游走
5.3.4.1 代码源:瓜子(转化状态空间 + 期望线性性 + 多终点)
小L 买了
小 L 每次都会从这堆瓜子中挑出一粒,他每次吃完一粒瓜子后,就会得到两瓣瓜子壳,他会把瓜子壳也丢进瓜子堆里面去。
如果他拿到了自己之前吃瓜子留下的瓜子壳,他就会把拿到的瓜子壳丢掉,否则就吃掉拿到的瓜子并且把瓜子壳丢进去。
现在设每次小 L 拿到每一粒瓜子或者是瓜子壳的概率是均等的,问小 L 期望多少次能够把瓜子拿完。
solution
首先不用在乎瓜子壳被丢出瓜子堆会对期望计算产生什么影响。因为期望具有线性性,所以没有影响。
设置状态
严格注意在终点状态
由马尔可夫链
显然无环。
从
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";
值域不大,逆元在这里可以被
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
Sato has a knack for increasing productivity, with a probability
Starting with a total of
精度误差不低于
soluton
这题稍微有些反常规套路,另外又加了其他一些小套路。但本质也属于简单。属于很优质的一类题。
初始给定
这时候设
这里的状态空间可以进行选择转移:
朵普通甜花合成 朵大甜花。- 选择
的概率 朵普通甜花合成两朵大甜花。 - 选择
的概率 朵普通甜花合成一个大甜花并返还 朵普通甜花。
这里显然是两个转移路径:
这里直观上的方程是从终点到起点发散的,在发散路径很多的时候很难转移。
改写成终点到起点归纳。
当
当
当自环存在时,期望问题可以使用类似计算抽卡模型的期望方式处理掉自环。
概率问题下的自环,大多情况下可以不选择这条路径。
再否则存在环但非自环的概率期望问题,大概率只能高斯消元。
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"; }
注意精度限制下的比较符,一个通用的方法是使用邻域,但不具备相等的传递性。
时间复杂度
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
- 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.
soluton
问题最终的朴素描述容易被抽象成一个几何模型:在一根
总轴长恒为
- 每次有
的概率左边的轴长度乘以 ,右边的轴相应缩短。 - 每次有
的概率右边的轴长度乘以 ,左边的轴相应缩短。 - 起始点跳到
或 结束。
进一步将几何模型转数学模型,设右端点为
- 每次有
的概率 。 - 每次有
的概率 。 - 起始点跳到
或 结束。
已知问题询问,起始点跳到
设
显然有
然后有:
. .
首先递推式成环。其次似乎不容易找到通项公式。
不妨直接观察增广矩阵。
它的线性方程组的矩阵形式为
显然线性方程组满秩。
官方题解中说:容易观察到答案为
另一个答案怎么算?设
不难发现
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
-th turn:- Walk Alone can choose an integer
and pay yuan as the wager. - If Walk Alone wins, he will get
yuan from the maker, which means he gains yuan in this turn. Otherwise, the maker will devour the yuan he has paid, which means he loses yuan in this turn. The probability that Walk Alone wins is .
- Walk Alone can choose an integer
Walk Alone has
- In the first turn, Walk Alone pays
yuan as the wager, i.e., . - If Walk Alone wins in the
-th turn, then . Otherwise, . - At the beginning of each turn, if Walk Alone has at least
yuan, then he gets satisfied and quits the game. Otherwise, he must pay yuan as the wager, and he will have to stop gambling if he has less than yuan.
Walk Alone's good friend, Kelin wants to exhort him not to gamble. Tell him the probability that he successfully earns an extra
soluton
马尔可夫链?
从马尔可夫链的角度去看,可以有状态
这显然是时空都不能接受的。
注意到:
- 类似二进制的表示,一定是 “输输……输输赢” 为一个周期,可以赢得一块钱。
- 假设当前有钱
,最多连输 次,第 次赢。 是 的最大值,即 。
定义事件
可以直接考虑连输了
这好算吗?戈门?这不好算。事件“连输了
总之,可以
注意到两个事件“从
目前是
不难注意到
可以使用类似数论分块的处理,当前枚举到
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";
考虑进计算逆元的复杂度,该问题可以在时间复杂度
5.3.7 看起来像是马尔可夫链的题
在
从原点开始随机游走,询问花费完
5.3.7.1 问题解析
这个问题可以抽象成高维正交空间,然后抽象成一维有界图。
假设
问 1: 可以直接按照马尔可夫链的方式 DP 吗?
答 1: 不能。因为问题询问的是花费完
- 如果是一道马尔可夫链的题,会只问从起点到达终点的概率。
问 2: 那应该怎么求解?
答 2: 只是个普通 DP ,dp[花费了
问 3 : 如果是个对称概率的游走,还有其他做法吗?
答 3: 首先如果是个对称概率的游走,那么严格走
- 问题已经转化为组合模型了,当然可以 DP 最终能走到终点的方案数。
- 不妨考虑分解每一维,枚举当前维一共会花费的步数
。假设向前 步,向后 步,则有 , ,线性方程组可解出 。于是每一维只需 求 的组合数。 - 复杂度瓶颈在于组合数的预处理和维度的分解,前者
,后者 。
原题出处: AtCoder Beginner Contest 011 D - 大ジャンプ
先不妨定义随机事件“第
一维怎么处理?不妨设起点为
首先一个观察是,问题要继续考虑,至少要满足两个性质:
假设向右走了
所以只需要选出
二维怎么处理?不妨设起点为
显然首先要满足
然后枚举
假设向右
第二维也是类似的做法,这一维在走
最终第
时间复杂度
三维怎么处理?不妨设起点为
更高维怎么处理?类似的可以扩展到高维,但转化成马尔可夫链后会发现本质依旧是一维边界对称随机游走。
5.3.7.2 考虑另一个问题
在
从原点开始随机游走,询问花费不超过
假设
问 1: 是不是也可以维护 dp[走了不超过
答 1: 显然可以直接维护,转移也很典型。
问 2: 如果是对称的游走呢?有其他解决办法吗?
答 2: 如果是对称游走,对某个固定步数
- 但如果是
的步数,需要分解为 的取球模型,显然这种似乎分解更复杂了。 - 如果可以快速容斥,上述分解的复杂度几乎可以忽略。很遗憾如果考虑容斥,那么对立状态就是“到不了终点的状态”,这些状态数量更多。显然不能快速容斥了。
- 所以直接 DP 就已经是一种高效的办法。
5.3.8 树上随机游走
5.3.8.1 小清新题
2023 牛客多校 10 https://ac.nowcoder.com/acm/contest/57364/K
题意
题解
特判
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"; }
如果强制从随机游走的角度考虑呢?假设我们不知道上面这个性质,另一个可选的方法是从随机游走角度考虑。
这里再引入一种树上随机游走的角度考虑问题的方式。
将问题视为一棵二叉树,红色节点有
- 问题可以看成不独立的,即连续
次往左节点走的概率。为 。 - 问题也可以看成独立的,即第
层红色节点出现的概率。为 。
更朴素地,将问题视为一棵
- 问题可以看成不独立,即连续
次红蓝节点之间走的概率。朴素计算需要维护树链前缀,枚举当前节点继续分叉。有一个取巧的办法是把这个问题根据分层看成一个 序列, 表示走到红或蓝节点,于是问题独立。 - 问题可以看成独立,即第
层红蓝节点出现的概率。这依旧好算,因为第 层红蓝节点出现的概率为
问题的思路:
-
取巧地将
叉树转成 叉树是方便计算不独立的概率的。 -
取巧地按
叉树的树层转化成其他模型也是容易将不独立的概率模型转成独立概率模型的。 -
但是最本质的视角是:随机前提下,每层每个节点的地位等价,每层直接节点也显然独立。
视角的正确性很多时候会优于技巧的积累。很多情况下问题变形后会让大量可以处理原模型的技巧失效。
5.3.8.2 有点意思题
题意
给
询问字典树最大节点数和期望节点数。
题解
最大节点数:
逐层考虑。
于是在
整棵树的最大节点数为
期望节点数:
根据期望的线性性,整棵字典树的期望等于每层的期望之和。
考虑某层不妨是第
又一层中每个节点的地位是等价的,于是一层的期望为
注意到: 字典树每层之间的节点看似不独立,但在随机概率下层与层之间是独立的,所以当前层的概率不需要依赖于上一层。
考虑一层中一个节点可以出现的概率。若
注意到: 出现的概率是或运算,不出现的概率是与运算。
于是可以考虑容斥,一个节点不出现的概率是
于是期望节点数为 (字典树第
Code
5.3.9 抽卡模型
5.3.9.1 2023 ICPC 网络赛第二场 I Impatient Patient
章节的开头我们以这题为例子讲述了抽卡模型。
一个经典的考虑:要么使用方案,要么不使用方案。(或许这在生活中过于显然以至于不重要,但需要强调的是这非常重要)
-
不使用方案肯定是自然恢复,问题容易解决。
-
使用方案呢?需要进行一些观察。
这个问题中,容易观察到在超过一个位置使用方案是没有意义的。
- 假设将在
使用方案,如果它们互相不可达,那么显然只有一个位置有意义。 - 如果
可达。即在 使用方案可达 ,并继续在 使用方案。这显然不优于一开始就在 使用方案。
所以如果使用方案,一定只有一个点可以使用方案。于是可以枚举在
于是只需要
5.3.9.2 2024 ICPC 网络赛第二场 L 502 Bad Gateway
题意
初始在
题解
设
考虑每个点
- 要么花费
秒走到 ,这么做的期望是 。 - 要么花费
秒随机成 中一个数,这么做的期望是 。
于是有
由
不难证明(比如反证)一个宽松的的界限是
如果
或者可以不三分,求导可以发现在
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(这是一道只用到了简单数学内容的出线题,其实是数学题)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?