生成函数
生成函数是一种将一个序列映射成一个多项式的方式,具体而言,对于无限/有限序列 \(a_1,a_2,\dots,a_n,\dots\),记 \(g(x)=a_1+a_2x+a_3x^2+\dots+a_nx^n+\dots\),则 \(g(x)\) 为原序列的生成函数。
生成函数可以用于解决一些计数问题,它可以利用乘法原理。
例如有 \(1g,2g,4g\) 砝码,问拼凑的质量及其对应方案。
对于 \(1g\) 砝码的生成函数:\(1+x\)。
对于 \(2g\) 砝码的生成函数:\(1+x^2\)。
对于 \(3g\) 砝码的生成函数:\(1+x^3\)。
乘起来,展开后对应的几次项系数就是拼凑出来的方案,例如有项 \(2x^3\),则拼凑出 \(3\) 有两种方案。
当然上面是有限的情况,可以是无限的。
小应用
求解 \(x_1+x_2+x_3\dots+x_n=k\) 的非负整数解个数。
这个已经很经典了,令 \(y_i=x_i+1\),变形为 \(y_1+y_2+y_3\dots+y_n=k+n\)。
转化为有 \(k+n\) 个小球,在它们之间插入 \(n-1\) 个隔板分成 \(n\) 部分,因为有 \(k+n-1\) 个槽,所以方案数 \(C_{k+n-1}^{n-1}\)。
而用生成函数:
每个 \(x\) 都可以有任意多个小球,即任意的 \(x_i\),生成函数为 \(1+x+x^2+x^3+\dots=\dfrac{1-x^n}{1-x}\)(等比数列求和),由于无限个,所以 \(x^n\) 趋于 \(0\),变为 \(\dfrac{1}{1-x}\)。
所以总的生成函数为 \(\dfrac{1}{(1-x)^n}\),展开后若需要总和为 \(k\),则 \(x^k\) 的系数应该就是一一对应的,为 \(C_{k+n-1}^{n-1}\)。
[例题]食物
- 承德汉堡:偶数个。
\(1+x^2+x^4+\dots=\dfrac{1-x^n}{1-x^2}=\dfrac{1}{1-x^2}\)
- 可乐:\(0\) 个或 \(1\) 个。
\(1+x=\dfrac{1-x^2}{1-x}\)。
- 鸡腿:\(0\) 个,\(1\) 个或 \(2\) 个。
\(1+x+x^2=\dfrac{1-x^3}{1-x}\)。
- 蜜桃多:奇数个。
\(x+x^3+x^5+\dots=x(1+x^2+x^4+\dots)=\dfrac{x}{1-x^2}\)
- 鸡块:\(4\) 的倍数个。
\(1+x^4+x^8+\dots=\dfrac{1}{1-x^4}\)。
- 包子:\(0\) 个,\(1\) 个,\(2\) 个或 \(3\) 个。
\(1+x+x^2+x^3=\dfrac{1-x^4}{1-x}\)。
- 土豆片炒肉:不超过一个。
\(1+x=\dfrac{1-x^2}{1-x}\)。
- 面包:\(3\) 的倍数个。
\(1+x^3+x^6+\dots=\dfrac{1}{1-x^3}\)。
接下来乘起来消消乐可得 \(x\times\dfrac{1}{(1-x)^4}\)。
生成函数为 \(x\sum_{n=0}^{\inf}a_nx^{n}=x\sum_{n=0}^{\inf}C_{n+4-1}^{4-1}x^{n}=\sum_{n=0}^{\inf}C_{n+3}^{3}x^{n+1}\)。
要求取到 \(x^N\) 时的答案,就是看前面的 \(n=N-1\),代入 \(C_{n+3}^3=C_{N+2}^3=\dfrac{(N+2)(N+1)N}{6}\)。
对应高精度,没有必要,读入时乘加时模即可(相当于把数拆解成了 \(10^n\) 的形式,而加、乘满足取模的封闭性)。