「ZJOI2019」开关
生成函数好题
看到这里一种开关的点击方案内部是无标号的考虑指数生成函数
考虑则第\(i\)步达成目标的概率的指数生成函数
那么
对于\(s_i=0\)的开关
\[F_i(x)=\sum\limits_{i = 0}^{\infty} \frac{(p_i*x)^{2i}}{(2i)!}=\frac{e^{p_i*x} + e^{-p_i*x}}{2}
\]
对于\(s_i=1\)的开关
\[F_i(x)=\sum\limits_{i = 0}^{\infty} \frac{(p_i*x)^{2i+1}}{(2i+1)!}=\frac{e^{p_i*x} - e^{-p_i*x}}{2}
\]
所有开关的指数生成函数
\[F(x)=\prod_i F_i(x)
\]
考虑到不同开关组成的方案内部是有顺序的
于是考虑转成普通生成函数
\[f(x)=\sum_{k>=0} k![x^k]F(x)
\]
但\(f(x)\)就是答案了吗?
并不是,因为我们求的是第一次
记\(g(x)\)为走了\(i\)步状态不变的普通生成函数
记\(h(x)\)为第\(i\)步第一次达成目标的普通生成函数
那么有
\[g(x)*h(x)=f(x)
\]
所以
\[h(x)=\frac {f(x)} {g(x)}
\]
我们同样列出
\[G_i(x)=\sum\limits_{i = 0}^{\infty} \frac{(p_i*x)^{2i}}{(2i)!}=\frac{e^{p_i*x} + e^{-p_i*x}}{2}
\]
然后
\[G(x)=\prod_i G_i(x)
\]
那么\(G(x)\)是\(g(x)\)的指数生成函数
我们考虑知道\(F(x)\)和\(G(x)\)求\(f(x)\)和\(g(x)\)
注意到我们如果把\(F(x)\)表示成
\(\sum_i a_i*e^{ix}\)的形式
这个东西可以做个背包搞出来
那么对于\(f(x)\)而言
\(f(x)= \\ =\sum_{k>=0} k![x^k]F(x) \\ =\sum_{k>=0} k!\sum_i a_i [x^k]e^{ix} \\ =\sum_{k>=0} k!\sum_i a_i \frac{1}{k!}*(ix)^k \\ =\sum_i a_i \sum_{k>=0}(ix)^k \\ =\sum_i a_i \frac {1} {1-ix}\)
对于\(g(x)\)是同理可算的
我们观察我们要求的答案事实上就是\(h'(1)=\frac {f'(1)g(1)-f(1)g'(1)}{g(1)^2}\)
但是当\(x=1\)的时候\(f(1)\)和\(g(1)\)都不收敛怎么办呢
洛必达搞
题解提供了一种别的思路:\(f(x)\)和\(g(x)\)同时乘上\((1-x)\)
这样两个就都可以正常算了