生成函数
我们可以把生成函数看作是代数对象,其形式上的处理使得人们可以通过代数手段计算一个计数问题。
普通生成函数
定义为:
\[\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}
\]
大概的意思就是刻画每个位置作为逆序对的后者出现了多少次。刚好每种不同的数量都对应着一个排列。
简单小练习:
(式子大多上面都写了,可以参考)
终于有例题了!
首先可以很好的列出生成函数:
\[\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}
\]
这题跟 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:不卡常,只是我快速幂写挂了)
需要使用扩展欧拉定理将指数减到模数级别,还可以再配合光速幂可以更快。
看到这里你就成功入门生成函数了!