生成函数

生成函数

我们可以把生成函数看作是代数对象,其形式上的处理使得人们可以通过代数手段计算一个计数问题。

普通生成函数

定义为:

\[\displaystyle\sum_{n}a_nx^n \]

常见的封闭形式转化:

\[\begin{aligned} \displaystyle\sum_{i\ge 0}c^i x^{ik} &\xrightarrow{\text{OGF}} \dfrac{1}{1-cx^k} \\ \displaystyle\sum_{i\ge 0}\binom{n}{i}x^i &\xrightarrow{\text{OGF}} (1+x)^n \\ \displaystyle\sum_{i\ge 0}\binom{i+k-1}{k-1}x^i &\xrightarrow{\text{OGF}} \dfrac{1}{(1-x)^k} \\ \displaystyle\sum_{i\ge 0}x^{2i} &\xrightarrow{\text{OGF}} \dfrac{1}{1-x^2} \\ \displaystyle\sum_{i\ge 0}\dfrac{c^i x^i}{i!} &\xrightarrow{\text{OGF}} e^{cx} \\ -\displaystyle\sum_{i\ge 0}\dfrac{x^i}{i} &\xrightarrow{\text{OGF}} \text{ln}(1-x) \\ \displaystyle\sum_{i\ge 0}\dfrac{(-1)^ix^i}{i} &\xrightarrow{\text{OGF}}\text{ln}(1+x) \end{aligned} \]

基本运算:

\[\begin{aligned} (\displaystyle\sum_{n}f_nx^n)\pm(\displaystyle\sum_{n}g_nx^n)&=\displaystyle{\displaystyle\sum_{n}(f_n \pm g_n)x^n} \\ c\times (\displaystyle\sum_{n}f_nx^n)&=\displaystyle\sum_{n}c\times f_nx^n \\ (\displaystyle\sum_{n}f_nx^n)(\displaystyle\sum_{n}{g_nx^n})&=\displaystyle\sum_{n}(\displaystyle\sum_{i=0}^{n}f_ig_{n-i})x^n \end{aligned} \]

小应用:求一个排列关于逆序对个数的生成函数:

\[\displaystyle\prod_{i=1}^{n}(\sum_{j=0}^{j-1}x^j)=\displaystyle\prod_{i=1}^{n}\dfrac{1-x^i}{1-x} \]

大概的意思就是刻画每个位置作为逆序对的后者出现了多少次。刚好每种不同的数量都对应着一个排列。

简单小练习:

P2000 拯救世界

(式子大多上面都写了,可以参考)

P6078 [CEOI2004] Sweets

终于有例题了!

首先可以很好的列出生成函数:

\[\displaystyle\prod_{i=1}^{n}\sum_{j=0}^{m_i}x^j=\prod_{i=1}^{n}\dfrac{1-x^{m_i+1}}{1-x}=(1-x)^{-n}\prod_{i=1}^{n}1-x^{m_i+1} \]

考虑 \((1-x)^{-n}\) 拆开得到:

\[(\prod_{i=1}^{n}1-x^{m_i+1})\sum_{j\ge 0}\binom{n+j-1}{j}x^j \]

\(n\) 非常小,那么先用 \(2^n\) 枚举前面括号内的所有可能,最终得到一个多项式 \(p\),至多有 \(2^ n\) 项。

差分,设 \(f(v)\) 表示糖果数小于等于 \(v\) 的所有方案的和,答案为 \(f(b)-f(a-1)\)

考虑对于 \(p\) 的某一项 \(k\),对 \(f(v)\) 的贡献即为:

\[p_k\sum_{i=0}^{v-k}\binom{n-1+i}{n-1}=p_k\binom{n+v-k}{n} \]

相当于统计最后指数相加不超过 \(m\),后一步是上指标求和。

注意到这题模数不友好,考虑把组合数写成下降幂形式,具体而言:

\[\binom{n}{m}=\dfrac{n^{\underline m}}{m!} \]

还是不方便,注意到组合数的下指标很小很小,考虑可以求出下降幂对模数乘以 \(m!\) 取模,再除去 \(m!\) 后在对模数取模。

当然你也可以使用扩展卢卡斯,砍瓜切菜。

指数生成函数

指数生成函数的定义为:

\[\sum_{i\ge 0}\frac{a_ix^i}{i!} \]

常见封闭形式转换:

\[\begin{aligned} \sum_{i\ge0}\dfrac{c^ix^i}{i!}&\xrightarrow{\text{EGF}}e^{cx} \\ \sum_{i\ge0}\dfrac{x^{2i}}{(2i)!}&\xrightarrow{\text{EGF}}\dfrac{e^x+e^{-x}}{2} \\ \sum_{i\ge0}\dfrac{x^{2i+1}}{(2i+1)!}&\xrightarrow{\text{EGF}}\dfrac{e^x-e^{-x}}{2} \end{aligned} \]

证明?泰勒展开(待学习)。

例题:用红白蓝三色给 \(1\times n\) 棋盘染色,要求红格颜色的个数是偶数,且至少有一个蓝色的方案数。

\[\begin{aligned} g(x)&=\sum_{i\ge 0}\dfrac{x^{2i}}{(2i)!}\sum_{i\ge 0}\dfrac{x^i}{i!}\sum_{i\ge 1}\dfrac{x^i}{i!} \\ &=\dfrac{e^x+e^{-x}}{2}e^x(e^x-1) \\ &=\dfrac{e^{3x}-e^{2x}+e^x-1}{2} \\ &=\dfrac{-1}{2}+\sum_{i\ge 0}\dfrac{3^n-2^n+1}{2}\dfrac{x^n}{n!} \end{aligned} \]

那么可以得到:(式子外有常数项,要小心!)

\[h_n=\begin{cases} 0 & n=0 \\ \dfrac{3^n-2^n+1}{2} & n>0 \end{cases} \]

P2012 拯救世界2

这题跟 P2000 的本质区别在于这题方案是有序(相同的东西不做区分),因此考虑 \(\text{EGF}\)

找到三种类型的基因分别对应的 \(\text{EGF}\)

\[\begin{aligned} f(x)&=e^x\\ g(x)&=\dfrac{e^x+e^{-x}}{2}\\ h(x)&=\dfrac{e^x-e^{-x}}{2} \end{aligned} \]

那么答案为

\[\begin{aligned} ans&=[\frac{x^n}{n!}]{n!}(f(x)g(x)h(x))^4\\ &=[\frac{x^n}{n!}](\dfrac{1}{4}e^x(e^{2x}-e^{-2x}))^4\\ &=[\frac{x^n}{n!}](\dfrac{1}{4}(e^{3x}-e^{-x}))^4\\ &=[\frac{x^n}{n!}]\dfrac{1}{256}(e^{12x}-4e^{8x}+6e^{4x}-4+e^{-4x}) \end{aligned} \]

那么又根据:

\[\sum_{i\ge0}\dfrac{c^ix^i}{i!}\xrightarrow{\text{EGF}}e^{cx} \]

\[ans=\dfrac{n!}{256}(\dfrac{12^n}{n!}-\dfrac{4\times 8^n}{n!}+\dfrac{6\times 4^n}{n!}+\dfrac{(-4)^n}{n!}) \]

因为是 \(\text{EGF}\),所以一定要记得乘以 \(n!\)

\[ans=\dfrac{1}{256}(12^n-4\times 8^n+6\times 4^n+(-4)^n) \]

注意到这个模数又很不友好,考虑将 \(n\) 很小的时候暴力乘,大的时候约分一手。

\[ans=81\times 12^{n-4}-8^{n-2}+6\times 4^{n-4}+(-4)^{n-4} \]

然后你写了个快速幂,高高兴兴的交上去,发现 TLE 了!

出题人很没素质地卡了常。(upd:不卡常,只是我快速幂写挂了)

需要使用扩展欧拉定理将指数减到模数级别,还可以再配合光速幂可以更快。

看到这里你就成功入门生成函数了!

posted @ 2024-04-26 08:42  Hanghang007  阅读(31)  评论(0编辑  收藏  举报