由于太菜了没学到什么本质...ubuntu
部分摘自18年论文“杨懋龙 浅谈生成函数在掷骰子问题上的应用”函数
定义:对于数列\(a_0,a_1,\dots,\),存在某个离散随机变量\(X\)知足\(P(X=i)=a_i\),那么\(a_n(n\in \mathbb N)\)的普通生成函数(OGF)为\(X\)的几率生成函数。学习
这里一样给出离散随机变量\(X\)的定义:函数\(X\):\(\Omega \to \mathbb R\)spa
语言说明就是定义在样本空间\(\Omega\)上肯定的实值函数,这点必定要搞清楚。游戏
而\(X=i\)实际表示的是一个事件,等价于集合\(\{\omega|\omega \in \Omega,X(\omega)=i\}\)事件
用符号语言表示几率生成函数即为
\[ F(z)=\mathbb E(z^X)=\sum_{i=0}^\infty P(X=i)z^i \]字符串
一些性质get
通常把\(z\)取\(1\)
\[ F(1)=\sum_{i=0}^\infty P(X=i)=1\\ E(x)=F'(1)=\sum_{i=0}^\infty iP(X=i)\\ Var(X)=F''(1)+F'(1)-(F'(1))^2 \]
第二个是指望,第三个是方差(能够发现是平方的指望-指望的平方的形式)qt
例题数学
题意:给一个长\(n(\le 10^5)\)值域为\(m(\le 10^5)\)的序列\(A\)。每一个时间掷一个\(1\sim m\)的公平骰子并将这个数字加入到初始为空的序列\(B\)的末尾,当\(A\)是\(B\)子串时,中止,求指望中止时间。
设\(f_i\)为\(i\)时间中止的几率,\(g_i\)为\(i\)时间不中止的几率,\(F(x),G(x)\)分别为它们的生成函数。
则有
\[ F(x)+G(x)=1+G(x)x \]
这个式子其实是
\[ f_i+g_i=g_{i-1} \]
即一个没中止的下一秒必定会分裂出的两个结果,\(1\)是\(g_0\),乘\(x\)表示在多项式中的递推。
考虑对这个式子作出变形,两边同时求导
\[ F'(x)+G'(x)=G(x)+G'(x)x \]
对\(x\)取\(1\)
\[ E(x)=F'(1)=G(1) \]
考虑求出\(G(1)\)
考虑对任意时间向后枚举一段长\(m\)的时间恰好与\(A\)匹配,此时必定会结束,但可能在中间结束。
为此,引入字符串中的一个概念
定义\(a_i=[\text{A[1,i]是border}]\)
那么
\[ G(x)(\frac{1}{m}x)^m=\sum_{i=1}^ma_iF(x)(\frac{1}{m}x)^{m-i} \]
左边是一路钦定过去,右边是可能结束的位置。
代入\(x=1\)化简一下
\[ \begin{aligned} G(x)&=\sum_{i=1}^ma_iF(1)m^i\\ &=\sum_{i=1}^mm^ia_i \end{aligned} \]
\(a\)这个东西就随便求了
题意:\(n(\le 300)\)我的每一个人猜一串长为\(m(\le 300)\)的掷硬币结果(\(0\)或\(1\)),而后每一个时间开始掷硬币,直到某我的的结果为当前结果序列的子串,中止,此人获胜。求每一个人获胜的几率。
无 脑 上 了
设\(f_{i,j}\)为第\(i\)我的在第\(j\)时间的时候获胜的几率,其生成函数为\(F_i(x)\)
\(g_i\)为第\(i\)个时间无人获胜的几率,其生成函数为\(G(x)\)
按照上一题的套路能够列出
\[ G(x)x+1=\sum_{i=1}^nF_i(x)+G(x)\\ G(x)(\frac{1}{2}x)^m=\sum_{i=1}^n\sum_{j=1}^m[A_k[1,j]=A_i[m-j+1,m]]F_i(x)(\frac{1}{2}x)^{m-i} \]
第二个式子须要枚举\(k\),也就是说它有\(k\)个。
注意到这恰好有\(n+1\)个方程和\(n+1\)个变量,能够\(x\)取\(1\)后直接高斯消元,化简一下能够获得
\[ \sum_{i=1}^nF_i(1)=1\\ \sum_{i=1}^nF_i(1)\sum_{j=1}^m[A_k[1,j]=A_i[m-j+1,m]]2^j=G(1) \]
咱们最后要求的便是\(F_i(1)\)
最后吐槽一下竟然不须要取模,这个精度怎么看都不是很对的样子