推歌:Sleep Talk Metropolis - Mili .
欢迎大家来看 Azune FFT!!!!
记几个 PGF 问题 .
原论文:《浅谈生成函数在掷骰子问题上的应用》杨懋龙 .
概率生成函数(PGF):
F(z)=E(zX)=∏i≥0P(X=i)zi
根据定义可以得到 k 阶阶乘矩 E(Xk––)=F(k)(1) .
进而可以推得方差:Var(X)=F′′(1)+F′(1)−F′(1)2 .
Problem 1
给一个序列 {an},序列 {b} 初始为空,每次生成一个 1…m 的均匀随机整数并加入序列 {b} 末尾,当 a 是 b 的子串时停止,问 {b} 的期望长度 .
n≤105 .
为了方便先令 pi 表示 a[1:i] 是否是 a 的一个 border .
令 fi 为结束时长度为 i 的概率,gi 为到长度为 i 还未结束的概率,其 PGF 分别为 F(z),G(z),则:
F(z)+G(z)=1+z⋅G(z)G(z)⋅(zm)n=n∑i=1pi⋅F(z)⋅(zm)n−i
对上式求导并代入 z=1 可得 F′(1)=G(1) .
对下式代入 z=1 可得 G(1)=n∑i=1pi⋅mi .
那么即可在 Θ(n) 的时间复杂度内求得 F′(1),即答案 .
Problem 1.5
同 Problem 1,但是求结束时 {b} 长度的 k 阶阶乘矩 .
n,k≤103 .
从推出两个表达式开始做,对上式求 k 阶导并代入 z=1 可得 F(k)(1)=k⋅G(k−1)(1) .
对下式求 k−1 阶导并代入 z=1 可得:
G(k−1)(1)=n∑i=1pi⋅mik−1∑j=0(−1)j(k−1j)(i+j−1)j+1––––F(k−j−1)(1)
综合,即得:
F(k−1)(1)=kn∑i=1pi⋅mik−1∑j=0(−1)j(k−1j)(i+j−1)j–F(k−j−1)(1)
于是得到一个线性递推,可以通过各式方法求解 .
Problem 2
给一簇序列 a1…n,长度分别为 l1…n . 序列 {b} 初始为空,每次生成一个 1…m 的随机整数(生成 i 的概率为 p(i))并加入序列 {b} 末尾,当 a1…n 都是 b 的子串时停止,问 {b} 的期望长度 .
n≤15,li≤2×104,m≤105 .
首先把相互包含的 a 删掉 .
使用 min-max 容斥,转为计算有一个出现就结束的答案 .
为了方便,令 p(S)=∏i∈Sp(i),ti,j,k=[ai[i:k]=aj[lj−k+1;lj]] .
令 fi,j 为结束时出现 ai 长度为 j 的概率,gi 为到长度为 i 还未结束的概率,其 PGF 分别为 Fi(z),G(z),则:
n∑i=1Fi(z)+G(z)=1+z⋅G(z)G(z)p(ai)⋅zli=n∑j=1li∑k=1ti,j,k⋅Fj(z)⋅p(ai[k+1,li])⋅zli−k
对上式求导并代入 z=1 可得 n∑i=1F′i(1)=G(1) .
对下式代入 z=1 可得:
G(1)=n∑j=1Fj(1)li∑k=1ti,j,kp(Ai[1:k])
和 n∑i=1Fi(1)=1 联立,Gauss 消元即可求出每个 Fi(1) .
所以本问题可以基于 Hash 做到 Θ(n∑li+2nn3) 的时间复杂度 .
Problem 3
有一个初始为空的序列 {a},每次生成一个 1…m 的均匀随机整数并加入 {a} 末尾,出现一个长度为 n 的全相同 / 全不同的子串时结束,问结束时 {a} 的期望长度 .
n,m≤106 . 保证过程能够期望在有限步内结束 .
传统做法也不是很难,下面给出 PGF 做法:
第一问
令 fi 为结束时长为 i 的概率,gi 为长为 i 没结束的概率,其 PGF 分别为 F(z),G(z),则:
F(z)+G(z)=1+z⋅G(z)G(z)(zm)n−1=n∑i=1F(z)(zm)n−i
后面的过程和前几题类似,最终可以得到 F′(1)=mn−1m−1 .
第二问
令 fi 为结束时长为 i 的概率,gi 为长为 i 没结束的概率,其 PGF 分别为 F(z),G(z),则:
F(z)+G(z)=1+z⋅G(z)G(z)(zm)nmn––=n∑i=1F(z)(zm)n−i(m−i)n−i–––––
最终 F′(1)=n∑i=1mi⋅mi– .
Problem 4
有一个初始为空的序列 {a},每次生成一个 1…n 的均匀随机整数并加入 {a} 末尾,出现一个长度为 n 的全是偶数的子串时结束,问结束时 {a} 的期望长度 .
n≤109 . 保证 n 是偶数 .
这个题和前面几个不太一样 .
令 fi 为结束时长为 i 的概率,gi 为出现一个长为 i 的全偶后缀的概率,其 PGF 分别为 F(z),G(z),则:
F(z)+G(z)=G(z)⋅z2+G(1)2+1F(z)=G(z)⋅zn
将后式代入前式可得:
G(z)(1+zn−z2)=n2+1
最终解出来可以得到 F′(1)=2nn+2 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】