基本搬运自《浅谈生成函数在掷骰子问题上的应用》。
对于定义在非负整数上的离散随机变量 X X ,级数 F ( z ) = ∑ i ≥ 0 Pr ( X = i ) z i F ( z ) = ∑ i ≥ 0 Pr ( X = i ) z i 记为 X X 的概率生成函数(PGF),本质上是有特殊性质的普通型生成函数。概率生成函数在一方面提供了一种刻画概率相关模型的工具,另一方面比较形式化地总结了一类概率问题的一般性思路。
一些性质
F ( 1 ) = ∑ i ≥ 0 Pr ( X = i ) = 1 F ( 1 ) = ∑ i ≥ 0 Pr ( X = i ) = 1
显然。
F ′ ( 1 ) = ∑ i ≥ 0 i Pr ( X = i ) = E ( X ) F ′ ( 1 ) = ∑ i ≥ 0 i Pr ( X = i ) = E ( X )
显然。类似的可以得出 F ( k ) ( 1 ) = E ( x k – – ) F ( k ) ( 1 ) = E ( x k _ ) 。
F ′ ′ ( 1 ) + F ′ ( 1 ) − ( F ′ ( 1 ) ) 2 = ( ∑ i ≥ 0 i 2 Pr ( X = i ) ) − ( ∑ i ≥ 0 i Pr ( X = i ) ) 2 = σ 2 ( X ) F ′ ′ ( 1 ) + F ′ ( 1 ) − ( F ′ ( 1 ) ) 2 = ( ∑ i ≥ 0 i 2 Pr ( X = i ) ) − ( ∑ i ≥ 0 i Pr ( X = i ) ) 2 = σ 2 ( X )
其中 σ 2 ( X ) σ 2 ( X ) 表示 X X 的方差,定义为 σ 2 ( X ) = E ( ( x − E ( x ) ) 2 ) = E ( x 2 ) − E 2 ( x ) σ 2 ( X ) = E ( ( x − E ( x ) ) 2 ) = E ( x 2 ) − E 2 ( x ) 。这一条不常用到。
这一类性质基本在期望问题时用到,核心思路是利用题目性质列出 PGF 或其导数的方程,代入 z = 1 z = 1 解出得到答案。
论文涉及了许多例题,但本质基本相同,只要理解了方法也不难独立推导出。在这里记录一些比较有代表性的题目。
[CTSC2006]歌唱王国
给定一个长度为 L L 的序列 A A 。然后每次掷一个标有 1 1 到 m m 的公平骰子并将其上的数字加入到初始为空的序列 B B 的末尾,如果序列 B B 中已经出现了给定序列 A A ,即 A A 是 B B 的子串,则停止,求序列 B B 的期望长度。
记 a i a i 表示 [ 1 , i ] [ 1 , i ] 是 A A 的 border。记 f i , g i f i , g i 表示 B B 长度为 i i 时,过程结束/未结束的方案数,其 PGF 分别为 F ( z ) , G ( z ) F ( z ) , G ( z ) 。考虑随机加入一个字符,和钦定加入序列 A A 之后的情况:
F ( z ) + G ( z ) = z G ( z ) + 1 G ( z ) ( z m ) L = L ∑ i = 1 a i F ( z ) ( z m ) L − i (1) (2) (1) F ( z ) + G ( z ) = z G ( z ) + 1 (2) G ( z ) ( z m ) L = ∑ i = 1 L a i F ( z ) ( z m ) L − i
其中第二个等式是由于我们可以从 border 处开始匹配。
将等式 ( 1 ) ( 1 ) 求导并代入 z = 1 z = 1 ,得到
F ′ ( z ) + G ′ ( z ) = z G ′ ( z ) + G ( z ) F ′ ( 1 ) = G ( 1 ) (3) (4) (3) F ′ ( z ) + G ′ ( z ) = z G ′ ( z ) + G ( z ) (4) F ′ ( 1 ) = G ( 1 )
将 z = 1 z = 1 代入等式 ( 2 ) ( 2 ) 中可得
G ( 1 ) ( 1 m ) L = L ∑ i = 1 a i F ( 1 ) ( 1 m ) L − i G ( 1 ) = L ∑ i = 1 a i m i (5) (6) (5) G ( 1 ) ( 1 m ) L = ∑ i = 1 L a i F ( 1 ) ( 1 m ) L − i (6) G ( 1 ) = ∑ i = 1 L a i m i
其中用到了 F ( 1 ) = 1 F ( 1 ) = 1 。至此我们已经可以高效且简洁的计算答案了。
[SDOI2017]硬币游戏]
给定 n n 个长度分别为 L i L i 的序列 A i A i ,保证每个序列互不相同。再给出一个标有 1 1 到 m m 的骰子,其中抛出 i i 的概率为 P i P i 。然后每次抛一次骰子将骰子上的数字加入到初始为空的序列 B B 末尾,如果给定的 n n 个序列的其中一个是 B B 的子串,则停止,这个序列获胜。求每个序列获胜的概率,并求结束时 B B 长度的期望。
较原题有所改动,不影响解题。
上一题的拓展。类似上一题的思路,记 PGF F i ( z ) , G ( z ) F i ( z ) , G ( z ) 分别表示第 i i 个串长度为 i i 时获胜的 PGF、长度为 i i 时未结束的 PGF,b i , j , k b i , j , k 表示第 j j 个串的 [ 1 , k ] [ 1 , k ] 和第 i i 个串的 [ l i − k + 1 , l i ] [ l i − k + 1 , l i ] 相同。考虑随机加入一个字符,和加入一个目标串:
G ( z ) + n ∑ i = 1 F i ( z ) = z G ( z ) + 1 ∀ i ∈ [ 1 , n ] , G ( z ) ( z m ) l i = n ∑ j = 1 l j ∑ k = 1 a i , j , k F j ( z ) ( z m ) L − k (7) (8) (7) G ( z ) + ∑ i = 1 n F i ( z ) = z G ( z ) + 1 (8) ∀ i ∈ [ 1 , n ] , G ( z ) ( z m ) l i = ∑ j = 1 n ∑ k = 1 l j a i , j , k F j ( z ) ( z m ) L − k
我们的目标是求每个 F i ( 1 ) F i ( 1 ) 。照例求导并代入 z = 1 z = 1 :
n ∑ i = 1 F i ′ ( 1 ) = G ( 1 ) ∀ i ∈ [ 1 , n ] , G ( 1 ) ( 1 m ) l i = n ∑ j = 1 l j ∑ k = 1 a i , j , k F j ( 1 ) ( 1 m ) l j − k (9) (10) (9) ∑ i = 1 n F i ′ ( 1 ) = G ( 1 ) (10) ∀ i ∈ [ 1 , n ] , G ( 1 ) ( 1 m ) l i = ∑ j = 1 n ∑ k = 1 l j a i , j , k F j ( 1 ) ( 1 m ) l j − k
这样我们得到了关于 F i ( 1 ) F i ( 1 ) 和 G ( 1 ) G ( 1 ) 一共 n + 1 n + 1 个未知数的 n n 个方程。发现 n ∑ i = 1 F i ( x ) ∑ i = 1 n F i ( x ) 即为随机序列长度的 PGF,于是得到最后一个方程
n ∑ i = 1 F i ( x ) = 1 ∑ i = 1 n F i ( x ) = 1
高斯消元即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?