生成函数

生成函数

OGF

现有一个序列 \(S\),第 \(i\) 项叫 \(s_i\).

它的生成函数 \(Fs = \sum_{i=0}^\infty s_ix^i\).

\[S = \{ s_0,s_1...s_i...\}\\ Fs =s_0 + s_1x...+s_ix^i... \]

\([x^i]Fs\) 表示只要其第 \(i\) 项,对应 \(S\) 的第 i 项。

然而我们知道某些函数是有封闭形式的,于是:

一些常见数列的生成函数

\[\begin{align} & S = \{1,1,1,1,1,1...\}\\ & F = \sum_i x^i = {1\over 1 - x} \\ & \text{等比数列求和公式}\\ & S = \{0,1, 0, 1, 0, 1...\}\\ & F = \sum_i x^{2i} = {1\over 1 - x^2}\\ & S = \{0,0, 0, 1,0,0,0, 1...\}\\ & F = \sum_i x^{4i} = {1\over 1 - x^4}\\ ... \end{align} \]

还有两个比较少见的:

\[\{0,1,\frac{1}{2},\frac{1}{3},\frac{1}{4}\dots\}\xrightarrow{\bf OGF}\ln\frac{1}{1-x}=-\ln(1-x) \]

\[\{1,1,\frac{1}{2!},\frac{1}{3!},\frac{1}{4!}\dots\}\xrightarrow{\bf OGF}e^x \]

运算

就是函数的加减乘除。

乘法就是多项式乘法。

\[h_i = \sum^i_{j=0}f_jg_{i-j} \]

对应到数列上,相当于项数之和为 \(i\) 的构成了乘积的第 \(i\) 项。

生成函数对应的变换

乘上 \(x\) 相当于项右平移一位。对应到原序列上,第 \(i\) 位的数现在就在第 \(i + 1\) 这里。

乘上 \(x^k\) 相当于项右平移 \(k\) 位。

观察一下:

\[\begin{align} & {1\over 1-x} = {1,1,1,1,1,1,1,1}\\ & {1\over (1-x)^2} = {1,2,3,4,5,6,7}\\ & {1\over (1-x)^3} = {1,3,6,10,15,21,28}\\ & {1\over (1-x)^4} = {1,4,10,20,35}\\ \end{align} \]

乘上 \(1\over 1 - x\) 相当于求一次原序列的前缀和。(参考乘法运算法则理解)

乘上 \(1\over (1 - x)^k\) 相当于求 \(k\) 次原序列的前缀和。(参考乘法运算法则理解)

注意力惊人的小盆友一定发现了:“这不就是一个杨辉三角吗?”

确实。

小推一下可以得到 \([x^i]\frac1{(1 - x)^k}={k+i-1\choose i}={k+i-1\choose k-1}\).

\[\begin{aligned} [x^i]\frac1{(1 - x)^k} &= (\frac 1{1-x})^k \\ &= (\sum x^i)^k \\&=\sum_{i} s_ix^i \end{aligned} \]

\(s_i\) 是选出非负数 k 个数相加等于 i 的方案数。这就是个插板法,所以 \(s_i = \binom {i + k - 1}k\)

乘上 \(1\over 1 - x^k\) 相当于隔 \(k - 1\) 位求一次和。(参考乘法运算法则理解)

对于较为一般的形式,

\[\begin{aligned}{[x^n]}\frac {ax^b}{(1 - kx^p)^c} &=a\times[x^{n-b}]\frac1{(1-kx^p)^c}\\ &= a[x^{n-b}]\sum_i\binom{i+c-1}c{(kx^p)^i}\\ &= [x^{n-b}]a\sum_i\binom{i+c-1}c{k^ix^{pi}}\\ &= [x^{n-b}]a\sum_i[p\mid i]\binom{i / p + c - 1}c{k^{i / p}x^{i}}\\ &= [p\mid n - b]a\binom{(n - b)/p+c-1}c{k^{n-b}} \end{aligned} \]

我愿称之为生成函数基本形式,求系数的主要思路就是转化成基本形式后用这个公式。

例题1:P10780 BZOJ3028 食物

(模板)

用序列的第 \(n\) 项来表示一共选择 \(n\) 个食物。

汉堡偶数个,对应序列 \(\{1,0,1,0,1\}\) (注意!这里位数编号从 0 开始),生成函数是 \(1\over 1-x^2\).

\[\begin{align} & \{1,0,1,0,1,0...\}=> {1\over 1-x^2} & \{1,1,0,0,0,0\} => 1 + x\\ & \{1,1,1,0,0,0\} => 1 + x + x^2\\ & \{0,1,0,1,0,1...\} => {x\over 1-x^2}\\ & \{0,0,0,1,0,0...\} => {1\over 1-x^4}\\ & \{1,1,1,1,0,0\} => {1+x+x^2+x^3}\\ & \{1,1,0,0,0,0\} => 1 + x\\ & \{0,0,1,0,0,1\} => {1\over 1-x^3}\\ \end{align} \]

发现乘法的意义是位数之和为 n ,相当于所有种类中一共选 n 个。.

所有把这些 F 乘起来,取第 k 项即可。

就是 \([x^n]{x\over (1-x)^4}\) ,就是 \(\binom{n+4}3\).

例题2:[P4451 国家集训队] 整数的lqp拆分

(解方程)

\[\begin{array}{l} 求 \sum_{m,A} \prod_{i=1}^{m} F_{a_{i}} \\ m>0 \\ a_{1}, a_{2} \ldots a_{m}>0 \\ a_{1}+a_{2}+\ldots+a_{m}=n \end{array} \]

给定 n ,\(F\) 是斐波那契序列,求可行方案权值(\(F_{a_i}\)的积)求和。

\(f_{i,j}\) 表示 \(m = i,\sum a_i = j\).

更具定义,\(f_{1,j} = F_j\).

枚举最后一个被选的数,令其为 k,之前的权值和是 \(f_{i-1,j-k}\) ,对每一种情况都要再乘上 \(F_k\) ,可得:

\[f_{i,j} = \sum_k f_{i-1,j-k}\times F_k \]

发现这是一个卷积的形式(多项式乘法),可写为: \(f_i = f_{i-1} * F = (f_1)^i= F^i\).

\[F_n = F_{n-1} + F_{n-2}\\ F - x = xf(x) + x^2f(x) \]

-x 是 \(F_1\) ,可以画图理解。

解得 \(F = {x\over1-x-x^2}\).

要求的是:

\[\begin{align} &\ \ \ \ \sum_{i=1} f_{i,n}\\ &= [x^n]\sum_{i=1} F^i\\ &= [x^n] \frac F{1-F}\\ &= [x^n] \frac {\frac x{1-x-x^2}}{1-\frac x{1-x-x^2}}\\ &= [x^n] \frac {x}{1-2x-x^2}\\ &= [x^{n-1}] \frac 1{1-2x-x^2} \end{align} \]

\(G = \frac 1{1-2x-x^2}\)\(G-2xG-x^2G = 1\). 把 G 的系数写出来:

\[\begin{align} G : &g_0,&g_1,&&g_2,&&g_3\\ 2xG:&0,&2g_0,&&2g_1,&&2g_3\\ x^2G:&0,&0,&&g_0,&&g_1 \end{align} \]

\(G-2xG-x^2G = 1\),得 \(g_0 = 1, g_1=2g_0=2,g_n=2g_{n-1}+g_{n-2}\).

设 p,q,我们希望这组 p q 能满足以下关系:

\[g_n-pg_{n-1}=q(g_{n-1}-pg_{n-2}) \]

又因为 \(g_n=2g_{n-1}+g_{n-2}\),化简可得:\(p+q =2, pq=-1\),解方程解出来 \(p,q=1\pm\sqrt 2\).

因为 p,q 是互厄的,所以:

\[\begin{align} g_n-pg_{n-1}&=q^{n-1}(g_{1}-pg_{0})\\ g_n-qg_{n-1}&=p^{n-1}(g_{1}-qg_{0})\\ &\text{下减上}\\ (p-q)g_{n-1}&=p^{n-1}(2-q)-q^{n-1}(2-p)\\ \because 2 - q = p,2-p = q\\ \therefore g_{n-1}&=\frac{p^n-q^n}{p-q} \end{align} \]

要求的就是 \(g_{n-1}\) ,p,q 用二次剩余算一算即可。

安利大佬博客:算法学习笔记:生成函数 - Re_Star - 博客园

例题3:AT_aising2020_f Two Snuke

(拉差)

题意:对于一个十元组 \(a_1, a_2, b_1, b_2, c_1, c_2, d_1, d_2, e_1, e_2\) ,定义它合法当且仅当满足下列条件:

\[\begin{align*} &0 \leq \alpha_{1}<\alpha_{2} 。\\ &0 \leq b_{1}<b_{2} 。\\ &0 \leq c_{1}<c_{2} 。\\ &0 \leq d_{1}<d_{2} 。\\ &0 \leq e_{1}<e_{2} 。\\ & a_{1}+a_{2}+b_{1}+b_{2}+c_{1}+c_{2}+d_{1}+d_{2}+e_{1}+e_{2} \leq n_{\text {。 }}\\ \end{align*} \]

现在有 T 组数据,每次对于给定的 n 求所有合法十元组 \(a_{2}-a_{1},b_{2}-b_{1},c_{2}-c_{1}, d_{2}-d_{1}, e_{2}-e_{1}\) 之和对 \(10^{9}+7\) 取模的结果。

\[1 \leq T \leq 100,1 \leq n \leq 10^{9} \text { 。 } \]

看到一大坨东西和小于等于 n 这条限制,于是想到生成函数。

\(n_1 = a_1+a_2,n_2=b_1+b_2...\)\(m_1 = a_2 - a_1,m_2= b_2- b_1\) , \(f_{i,j}\) 表示考虑了前 \(i\) 种数,和为 \(j\) 的答案。

现在我们考虑一组数和为 \(n_i\),可以分成 0 和 \(n_i\) 此时 \(m_i\)\(n_i\),也可以分成 1 和 ,\(n_i-1\) 此时 \(m_i\)\(n_i−2\)

以此类推,我们可以发现一组数的和 \(n_i\) 确定时所有情况的 \(m_i\) 呈现等差数列的形式,我们设 \(g_i\) 为一组数和为 i 时所有情况 m 的和。需要分两种情况,如果 i 为奇数,\(g_i=\frac{(i+1)^2}4\),i 为偶数时 \(g_i=\frac{i(i+2)}4\)

所以:

\[f_{i,j} = \sum_{k=1}f_{i-1,j-k}\times g_k \]

\[f_i = f_{i-1} \otimes g - f_{i-1}g_0 = f_{i-1} \otimes g (g_0 = 0) \]

要求的就是 \([x^n]f_5=[x^n]g^5\).

推一下 g 的封闭形式:

\[\begin{align*} g = & F_1 + F_2\\ F_1 = & 0, 1, 0, 4, 0, 9, 0, 16...\\ F_2 = & 0, 0, 2, 0, 6, 0, 12, 0...\\ \\ g = &\sum F_i\\ F_1 = & 0, 1, 0, 1, 0, 1, 0, 1...\\ F_2 = & 0, 0, 2, 0, 2, 0, 2, 0...\\ F_3 = & 0, 0, 0, 3, 0, 3, 0, 3...\\ F_4 = & 0, 0, 0, 0, 4, 0, 4, 0...\\ F_5 = & 0, 0, 0, 0, 0, 5, 0, 5...\\ F_5 = & 0, 0, 0, 0, 0, 0, 6, 0...\\ F_5 = & 0, 0, 0, 0, 0, 0, 0, 7...\\ &...\\ g = &\sum_i {ix^{2i-1}\over 1-x^2} \\ g = &{1\over 1-x^2}\sum_i {ix^{2i-1}}\\ g = &{1\over (1-x^2)} {x\over (1-x)^2}\\ g = &{x\over (1-x^2)(1-x)^2}\\ g^5 = &{x^5\over (1-x^2)^5(1-x)^{10}}\\ A = \sum_{i=0}^n g^5 = &{1\over 1-x}\times{x^5\over (1-x^2)^5(1-x)^{10}}\\ =&{x^5\over (1-x^2)^5(1-x)^{11}} \end{align*} \]

\[\begin{align*} [x^{n}]A = & {x^5\over (1-x^2)^5(1-x)^{11}}\\ [x^{n-5}] A = & {1\over (1-x^2)^5(1-x)^{11}}\\ 设 A &= L1 \times L2\\ L1 = &\frac1{(1-x^2)^5}, L2 = \frac1{(1-x)^{11}}\\ [x^{n}] g^5 &= \sum[x^i]L1\times[x^{n-i}]L2\\ \end{align*} \]

因为 L2 只有偶数项的值,所以,只用累加偶数,故:(别把奇偶想反了)

\[\begin{align*} [x^{n}] A &= \sum_{i=0}^{n/2}[x^{2i}]L1\times[x^{n-2i}]L2\\ &= \sum_{i=0}^{n/2}[x^{2i}]\frac1{(1-x^2)^5}\times[x^{n-2i}]\frac1{(1-x)^{11}}\\ &= \sum_{i=0}^{n/2}[x^{i}]\frac1{(1-x)^5}\times[x^{n-2i}]\frac1{(1-x)^{11}}\\ &= \sum_{i=0}^{n/2}\binom{5 + i - 1}{5 - 1}\times\binom{11 + n - 2i - 1}{10}\\ &= \sum_{i=0}^{n/2}\binom{4 + i}4\times\binom{10 + n - 2i}{10}\\ \end{align*} \]

把 n 看成系数,i 看成变量,所以这是一个关于 i 的 14 次方程,因为求了前缀和,所以是 15 次的(关于谁不重要,不影响我拉差),可以拉差。

可以这么理解:

\[F(x) = \sum_{i=0}^{x}\binom{4 + i}4\times\binom{10 + n - 2i}{10} \]

发现 F 是关于 x 的 15 次方程,然后我们要求 F(n/2),所以拉差。

不要忘了平移 n 。

例题4:[AT_abc241_h ABC241Ex] Card Deck Score

(待定系数)

有 n 种卡牌,每张卡牌上有一个数字,具体的,有 \(b_i\) 张卡牌上的数字为 \(a_i\)

求出拿走其中 m 张卡牌的贡献之和。贡献为这些卡牌的乘积。对于本质相同的卡牌组合,只算一次。

\(n \le \huge{16}\) , \(m \le 10^{18}\)

按照套路,对于每种牌写出其生成函数,\([x^k]\) 代表选 k 张。注意这里有上界 \(b_i\).

\[f_i = \sum_{j=0}^{b_i} a_i^jx^j = \frac {1-(a_ix_i)^{b_i+1}}{1-a_ix} \]

要求的就是:

\[[x^m]\prod_i f_i = \prod_i \frac {1-(a_ix_i)^{b_i+1}}{1-a_ix} \]

分子是很多个 \((1-x^k)\) 向乘,但是因为 n 小于 16,所以可以暴力展开。

假设展开以后,第 i + 1 项是 \(c_ix^{d_i}\),

\[[x^m] ans = \sum c_i[x^{m-d_i}]\prod \frac1{1-a_jx} \]

设:(可以看为把右边通分,凑出来了一组 p 使等式成立)

\[\begin{align} \prod \frac1{1-a_ix} &= \sum \frac{p_i}{1-a_ix}\\ \sum \frac{p_i}{1-a_ix}\prod {1-a_ix}&= 1 \end{align} \]

通分

\[\sum^n_{i=1}p_i\prod^n_{j=1,j\neq i}1-a_jx=1 \]

这是一个恒等式,a 已知,要去求 \(p_i\),按照这么多年数学课培养出来的直觉,虽然我没有被培养出来,这时候应该同伙特殊值法去求 p。代入 \(x = \frac1{a_1}\),发现只有第一项有值,得到:

\[p_1\prod^n_{j=1,j\neq i}1-{a_j\over a_i}=1 \]

\[p_1=\frac1{\prod^n_{j=1,j\neq i}1-{a_j\over a_i}} \]

同理代入 \(x = \frac1{a_i}(1\le i\le n)\),可以求出其他的 p。

答案是:

\[\begin{align} [x^m] ans &= \sum c_i[x^{m-d_i}]\prod \frac1{1-a_jx}\\ &= \sum c_i[x^{m-d_i}]\sum \frac{p_j}{1-a_jx}\\ &= \sum c_i\sum [x^{m-d_i}]\frac{p_j}{1-a_jx}\\ \end{align} \]

右边还是一个等差数列生成函数的封闭形式,第 \(x^{m-i}\) 项自然是 \(p_j(a_jx)^{m-i}\).

一个一个求就行了。

生成函数转递推式

先瞪眼,如果能直接瞪出来是最好的。

对于小清新的生成函数,直接求导,然后整理成递推式。例题.

递推式转生成函数

常系数齐次线性递推,这个又分为两种,第一种就是直接多项式取模,第二种则需要小推一下式子。前者更好理解,但缺点是写不出通项公式,这个会直接得到每一个初始项的系数。手算的话可以考虑常系数齐次线性递推的第二种求法。

递推式转通项公式

方法1:用特征多项式求。就是例题 2 的做法。

方法2:当然可以矩阵快速幂,不过当递推的项数多了,还能更快。这里文末有详细介绍

简单讲一下,

假设原来的转移矩阵是 C,想办法把 C 变成 \(ABA^{-1}\) 的形式,其中 B 是一个对角矩阵。

这样有什么好处呢?考虑 \(C^k = (ABA^{-1})^k = AB^kA^{-1}\)。这就是展开后发现 \(A^{-1}\)\(A\) 刚好消掉了。

容易发现,对角矩阵的 k 次幂就是矩阵里面每个数的 k 次幂构成的矩阵,这是算法的核心。

然后用矩阵乘法定义暴力把 \(A(B^k)A^{-1}\) 三个矩阵乘起来,就可以得到递推式第 k 项的值。

其中,A 是由两个特征向量所在空间的基拼起来的。

方法3:用裂项待定系数的方法。类似于例 4。其本质其实是有理展开定理。

以斐波那契数列为例,

\[F(x)=\dfrac{x}{1-x-x^2} \]

\(1-x-x^2=0\) , 得到 \(x_1=\frac{-\sqrt{5}-1}{2},x_2=\frac{\sqrt{5}-1}{2}\)

\[F(x)=\dfrac{x}{(x-x_1)(x-x_2)} \]

我们断言 \(F\) 能被表示成两个分式的和,即

\[F(x)=\dfrac{a}{x-x_1}+\dfrac{b}{x-x_2} \]

这个形式的 F 就变成了生成函数的基本形式,可以求其系数。

\[\dfrac{a}{x-x_1}+\dfrac{b}{x-x_2}=\dfrac{x}{(x-x_1)(x-x_2)} \]

解得 \(a=\frac{5-\sqrt{5}}{10},\ b=\frac{5+\sqrt{5}}{10}\)

\(a,b\) 除了直接费老大功夫解二元方程外,还有一种简便方法:

不妨在两边乘上 \(x - x_1\)

\[(x-x_1)\dfrac{a}{x-x_1}+(x-x_1)\dfrac{b}{x-x_2}=(x-x_1)\dfrac{x}{(x-x_1)(x-x_2)} \]

\[{a}+(x-x_1)\dfrac{b}{x-x_2}=\dfrac{x}{(x-x_2)} \]

因为上式的含义是 x 无论取多少都恒等,所以 \(\lim x \rightarrow x_1\)

\[{a}=\dfrac{x_1}{(x_!-x_2)} \]

同理可得 \(b=\large\frac{x_2}{x_2-x_1}\).

使用基本形式公式容易得到,$$F[n]=\dfrac{\sqrt{5}}{5}\left[\left(\frac{1+\sqrt{5}}{2}\right){n}-\left(\frac{1-\sqrt{5}}{2}\right)\right]$$。

有一种特殊情况,就是方程的有些根可能相同,再用前面的裂项会有点问题。写为一般形式:\(G(x)=\prod(x-x_i)^{k_i}\)

这个时候裂项出来的是:

\[\frac{a_1}{(x-x_1)^1} + \frac{a_2}{(x-x_1)^2} +\dots+\frac{a_{k_1}}{(x-x_1)^{k_1}} +\frac{b_1}{(x-x_2)^1} \dots \]

大概是这个样子的。虽然这个东西看起来很吓人,但一般来说遇到的 G 的项数会很少,所以还是很好算的。

求系数技巧

(本质上是求通项公式)

经常会遇到要求 \(\dfrac {F(x)}{G(x)}\) 的时候。

最快的方法就是瞪眼法,如果不行,还可以找一个类似于 G 的逆元的东西替代。

  1. 分式分解

我们能轻松求出 \(\dfrac1{(1-x^k)^p}\) 的系数,所以考虑用其因子来表示 G。

例如:\(F(x)=\dfrac{1}{(1-z)(1-z^2)(1-z^5)}\) ,需要提取其系数。

容易发现 \((1-z)(1-z^2)(1-z^5)\big|(1-z^{10})^{3}\),令 \(A(x) = \dfrac{(1-z^{10})^{3}}{(1-z)(1-z^2)(1-z^5)}\)

于是 \(\dfrac{1}{(1-z)(1-z^2)(1-z^5)} = \dfrac{A(x)}{(1-z^{10})^{3}}\). 根据之前整除的限制,可得 A 是一个次数有限的多项式,这非常的好呀,这样可以直接暴力把 A 的每一项系数都求出来。

\[\begin{aligned} A(z)&=(1-z^{10})^{3}/(1-z)(1-z^2)(1-z^5)\\ &=z^{22} + z^{21} + 2 z^{20} + 2 z^{19} + 3 z^{18} + 4 z^{17} + 5 z^{16} \\ &+ 6 z^{15} + 7 z^{14} + 8 z^{13} + 7 z^{12} + 8 z^{11}\\ &+ 7 z^{10}+ 8 z^9 + 7 z^8 + 6 z^7 + 5 z^6 \\ &+ 4 z^5 + 3 z^4 + 2 z^3 + 2 z^2 + z + 1 \end{aligned} \]

\(F[n]=\sum\limits_{i=0}^{22}A[i]\big[10|(n-i)\big]\dbinom{(n-i)/10+2}{(n-i)/10}\)

  1. \(Bostan-Mori\) 算法

先咕着,我不会。

  1. 有理展开

太复杂了,但是这个思路值得学习。

使用条件,对于 \(\dfrac {F(x)}{G(x)}\) ,G 可以被因式分解。对于多项式因式分解,可以瞪眼瞪出来最好,次数低于 5 次的话可以使用求根公式。

我们的目标其实是搞成基本形式后套公式解决,也就是要裂项。

下面给出有理展开的公式:

不同根有理展开定理,(用于每个根都不同的时候):

我们将 \(Q(x)\) 因式分解成 \(q_0 \displaystyle\prod_{i = 0}^l (1 - \rho_i x)\)(其中 \(\rho_i\) 互不相等,也就是说,\(S(x)\) 中所有 \(m_i\)\(= 0\)),若 \(P(x)\) 是次数小于 \(l\) 的多项式,那么有结论 \([x^n]R(x) = \displaystyle\sum_{i = 1}^l a_i \rho_i^n\),其中 \(a_i = \displaystyle\frac{- \rho_i P \left( \frac{1}{\rho_i}\right)}{Q'\left( \frac{1}{\rho_i}\right)}\)

有理展开定理一般形式,(使用数学归纳法证明):

\(Q(x) = q_0 \displaystyle\prod_{i = 1}^l (1 - \rho_i x)^{d_i}\)\(\rho_1, \rho_2, \dots, \rho_l\) 互不相等,而 \(P(x)\) 是一个次数小于 \(d_1 + d_2 + \dots + d_l\) 的多项式,那么 \([x^n]R(x) = \displaystyle\sum_{i = 1}^l f_i(n) \rho_i^n\),其中 \(f_i(n)\) 是一个次数为 \(d_l - 1\) 且首项系数为 \(a_i = \displaystyle\frac{(-\rho_i)^{d_i} P \left(\frac{1}{\rho_i} \right) d_i}{Q^{(d_i)} \left(\frac{1}{\rho_i} \right)} = \frac{P \left(\frac{1}{\rho_i} \right)}{(d_i - 1)! q_0 \prod\limits_{j = 1 \wedge j \neq i}^l \left(1 - \frac{\rho_j}{\rho_i} \right)^{d_j}}\)

求生成函数系数的一半思路就是,先用常系数齐次线性递推,把递推式转生成函数,然后再用有理展开把生成函数转通项公式。

例5 勘破神机

跳过前面 dp 的内容。

不容易得到,\(g_n = 4g_{n-1} -g_{n-2}\)

现在要求 \(\large{\sum_i^r} \binom{g_i}k\). \(k\le501,r\le6e18\).

使用常系数齐次线性递推可得,g 对应的生成函数为 \(\dfrac{-x+1}{x^2-4x+1}\),把 \({x^2-4x+1}\) 因式分解,然后用有理展开算它的通项公式,可得:

\[g(n)={3+\sqrt3\over6}\left(2+\sqrt3\right)^n+{3-\sqrt3\over6}\left(2-\sqrt3\right)^n \]

boss 进入第二阶段。

为了方便表示,我们定义 \(a = {3+\sqrt3\over6},{x_1=(2+\sqrt3)^n},b={3-\sqrt3\over6},{x_2=(2-\sqrt3)},g(n) = a\times x_1^n + b\times x_2^n\)

于是就变成了快乐推式子题!

\[\begin{aligned} {\sum_i^r} \binom{g_i}k &= \sum\binom{a\times x_1^i + b\times x_2^i}k\\ &=\frac1{k!}\sum_i(a\times x_1^i + b\times x_2^i)^\underline k\\ &=\frac1{k!}\sum_i\sum_j(-1)^{k-j}{k\brack j}(a x_1^i + b x_2^i)^j\\ &=\frac1{k!}\sum_i\sum_j(-1)^{k-j}{k\brack j}\sum_p^j\binom jp(a x_1^i)^p ( b x_2^i)^{j-p}\\ \end{aligned} \]

交换和式,然后发现后面一坨还可以用等差数列求和公式,可以搞成和式上界是 k 的式子。

例6[P4931 MtOI2018]情侣?给我烧了!

例7 CF438E The Child and Binary Tree

  • 给出一个集合 C,你要计数由集合 C 中的元素构成的二叉树
  • “一棵带点权的树的权值,是其所有顶点权值的总和。”
  • “第 \(i\) 行应当含有权值恰为 \(i\) 的神犇二叉树的总数。”
  • “请输出答案关于 \(\bf 998244353\) 取模的结果”

设 F 为答案的生成函数。设 \(G(x)=[x\in C]\),表示选出一个元素能构成的树。类似于卡特兰数,对 F 的递推式有:

\[F[n] = \sum_i G[i]\sum_j F[j]F[n-i-j] \]

\[F[0] = 1 \]

这相当于枚举根节点为的权值为 i,左子树为 j,右子树为 n - i - j。用函数卷积形式表示为:

\[F(x) = 1 + G(x)F^2(x) \]

解方程得:

\[F(x)=\dfrac{1±\sqrt{1-4G(x)}}{2G(x)} \]

让 G(x) 趋近于 0 时发现只有取负号收敛,于是就可以大力多项式做了。

例8 queue2 - Problem Detail - Hydro

题意 : 对 \(1...n\) 进行排列,满足相差 \(1\) 的两个数不会相邻,问方案数。

直直直直接上容斥搞!

PS:这里把满足**相差为 1 **连续的一个区间,叫做一个段。

\(f_i\) 为钦定有 i 个处相差为 1, \(g_i\) 为恰好 i 处相差 1。\(g_0\) 就是答案。

\[f_i = \sum_{j=i} \binom ji g_j \]

\[g_0 = \sum_{i=0}^n(-1)^i\binom i0 f_i = \sum_{i=0}^n(-1)^i f_i \]

想办法搞 F,考虑生成函数。

先考虑只有一个连续段的时候。设序列长度为 n,观察发现,当 n = 1 时,肯定只有一种方案,当 n > 1 是,有上升和下降的两种方案,例如 n = 4 时,有 1 2 3 4 和 4 3 2 1。

所以写成生成函数就是 \(H = x + 2x^2+2x^3...2x^n... = \dfrac{x+x^2}{1-x}\)。(注意这里的第 n 项系数表示的是序列长度为 n 的答案)

如果要划分成 k 段,然后每段之间可以交换位置,就是 \(k!H^k\),所以 \(F_{n-k} = [x^n]k!H^k\)。然后带回原式大力化简:

\[G_0 = \sum_{i=0}^n(-1)^i[x^n](n-i)!H(x)^{n-i} \]

再拿生成函数来表示 G:(这里 G 的第 n 项系数表示序列长度为 n 时的答案)

\[G(x)=\sum\limits_{n=0}x^n\sum\limits_{i=0}^n(-1)^i[x^n](n-i)!H(x)^{n-i} \]

由于有 \(G = \sum_ix^ig_i=\sum_ix^i[x^i]G\),要把后面化成类似的式子。

\[G(x)=\sum\limits_{n=0}x^n[x^n]\sum\limits_{i=0}^n(-1)^i(n-i)!H(x)^{n-i} \]

\[G(x)=\sum\limits_{n=0}x^n[x^n]\sum\limits_{i=0}^n(-1)^n(-1)^i(i)!H(x)^{i} \]

\[G(x)=\sum\limits_{n=0}x^n[x^n]\sum\limits_{i=0}^n(-1)^n(i)!(-H(x))^{i} \]

反正只求 n 次项系数,在前面乘上 \((-1)^n\) 其实等价于把 \(H(x)\) 变为 \(H(-x)\).

\[G(x)=\sum\limits_{n=0}x^n[x^n]\sum\limits_{i=0}^n(i)!(-H(-x))^{i} \]

终于到了想要的形式,所以:

\[G(x) =\sum\limits_{i=0}^ni!(-H(-x))^{i} \]

要求递推式的话还是只有求导一个方法,把上式看成复合函数来求导。

\[\begin{aligned} R(x) &= \sum_{i=0} i!x^i\\ R'(x)&= \sum_{i=1} i!ix^{i-1}\\ x^2R'(x)&= \sum_{i=1} i!ix^{i+1}\\ x^2R'(x)&= \sum_{i=2} (i-1)!(i-1)x^{i}\\ x^2R'(x)&= \sum_{i=2} (i-1)!ix^{i} - \sum_{i=2} (i-1)!x^{i}\\ x^2R'(x)&= \sum_{i=2} i!x^{i} - x\sum_{i=2} (i-1)!x^{i-1}\\ x^2R'(x)&= R(x) - 1 - x - x\sum_{i=1} (i)!x^{i}\\ x^2R'(x)&= R(x) - 1 - x - x(R(x)-1)\\ R'(x) &= \dfrac{R(x) - 1 - x - x(R(x)-1)}{x^2}\\ G(x) &= R(P(x))=\sum i!(P(x))^i\\ G'(x) &= R'(P(x))P'(x)\\ G'(x) &= \dfrac{R(P(x)) - 1 - P(x) - P(x)(R(P(x))-1)}{P(x)^2}P'(x)\\ G'(x) &= \dfrac{G(x) - 1 - P(x)G(x)}{P(x)^2}P'(x)\\ \end{aligned} \]

其中 \(P(x) = (-H(-x)) = \dfrac{x^2-x}{1+x}\) ,把这玩意带入,接下来就是体力活了,反正最后可得:

\[(x^5-x^4-x^3+x^2)H'(x)=(-x^4-2x^3-2x+1)H(x)+x^3+3x^2+x-1 \]

然后再大力提取系数得到递推式:

\[H_n=(n-3)H_{n-4}-(n-5)H_{n-3}-(n-2)H_{n-2}+(n+1)H_{n-1} \]

真的构式题目

EGF

引入:

现在有 a b 两种有标号物品,放 i 个 a 物品的方案数为 \(A[i]\),放 j 个 b 物品的方案数为 \(B[j]\), 现在要有序地合并 a b 两种物品,求放 k 个物品的方案数。

这其实就是归并,归并的时候要乘上一个插板法的系数,写成 dp 方程就是

\[C[k] = \sum_{i+j=k} \binom kiA[i]B[j] \]

这个组合数破坏了原本优美的卷积形式,但是如果我们这样改写上式:

\[C[k] = \sum_{i+j=k} \dfrac {k!}{i!j!}A[i]B[j] \]

\[\dfrac{C[k]}{{k!}} = \sum_{i+j=k} \frac{A[i]}{i!}\frac{B[j]}{j!} \]

如果把 \(\dfrac{A[i]}{i!}\) 当成 \(A'[i]\) 后,这又是一个卷积的形式,可以加上 x 的幂次进行区分:

\[C'(x) = \sum x^k\dfrac{C[k]}{{k!}} = A'(x)B'(x) \]

于是可以把 A 和 B 卷积起来后在乘上一个 \(k!\) 就是放 k 个有序物品的方案数。

定义:对于序列 \(F[n]\),,其 EGF 就是 \(F(x) = \sum f_i\dfrac{x^i}{i!}\)

EGF 常用来处理排列,或其他需要注意顺序的东西。

机房有位神犇说,EGF 是用于处理针对集合大小的问题。

常用数列 EGF:

  • \(\{1,1,1,1,1\dots\}\xrightarrow{\bf EGF}e^x\)

  • \(\{1,-1,1,-1,1\dots\}\xrightarrow{\bf EGF}e^{-x}\)

  • \(\{1,c,c^2,c^3\dots\}\xrightarrow{\bf EGF}e^{cx}\)

  • \(\{1,0,1,0,1,0\dots\}\xrightarrow{\bf EGF}\dfrac{e^x+e^{-x}}{2}\)

    Tips : 前两个加起来除以2。

  • \(\{1,a,a^{\underline 2},a^{\underline 3},a^{\underline 4}\dots\}\xrightarrow{\bf EGF}(1+x)^a\)

    Tips : 考虑组合数的定义。

运算:

加法:\(A = B+C \Rightarrow A(x) = B(x) + C(x)\).

乘法:\(\dfrac{C[k]}{{k!}} = \sum_{i+j=k} \frac{A[i]}{i!}\frac{B[j]}{j!}\).

对比 OGF 和 EGF,

\(\rm OGF\) : {AAAA}×{BBB} → {AAAABBB}

\(\rm EGF\) : {AAAA}×{BBB} → {AABABBA},{BAABAAB},{BBABAAA}...共C(4+3,3)种

注意,我们在实战中把 EGF 当成 OGF 来运算,所以结束时提取系数需要乘以 \(i!\) (易被遗忘)。

例题:「染色问题」(纯数学)

用红蓝绿三种颜色,涂一个长度为 \(n\) 的纸条,使得红色和蓝色的个数是偶数,求方案数。

我们用单独一种颜色涂任意长的纸条,方案数都是 \(1\) 。由于前两种颜色不能涂奇数个,可以认为奇数的方案数是 \(0\)

然后,我们给纯色的纸条分配标号,“归并”成多色的纸条,而这对应着 EGF 卷积。

绿色的EGF : \(\sum\limits_{i=0}\dfrac{x^{i}}{i!}=e^x\quad\) ( \(\{1,1,1,1...\}\) )

红和蓝的EGF : \(\sum\limits_{i=0}\dfrac{x^{2i}}{(2i)!}=\dfrac{e^x+e^{-x}}{2}\quad\) ( \(\{1,0,1,0...\}\) )

把生成函数乘起来得到:

\[\left(\dfrac{e^x+e^{-x}}{2}\right)^2e^x=\dfrac{e^{3x}+2e^x+e^{-1}}{4} \]

(分别)提取系数就能得到 :

\[{\rm Ans[n]}=\dfrac{3^n+2+(-1)^n}{4} \]

后记

参考(复制)了巨量 commend_block 和 Re_star 的博客。

posted @ 2025-03-19 21:52  花子の水晶植轮daisuki  阅读(81)  评论(2)    收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js