「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)\)

这样两个就都可以正常算了

code

posted @ 2020-07-02 21:22  deaf  阅读(225)  评论(2编辑  收藏  举报