生成函数

生成函数

生成函数是一种将一个序列映射成一个多项式的方式,具体而言,对于无限/有限序列 \(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\) 的形式,而加、乘满足取模的封闭性)。

AC

posted @ 2023-07-29 14:20  wscqwq  阅读(21)  评论(0编辑  收藏  举报