当前位置: 首页 > news >正文

多项式 - 生成函数

前置

先来定义形式幂级数,为一个形如 \(\sum_{n\ge0}a_nx^n\) 的表达式。
其中, \(x^n\) 为占位符,没有类似于自变量一样的实际含义。
\(\{a_i\}\) 是系数序列,实际上,你完全可以将这个形式幂级数看做数列的一种写法。
举个例子, \(f(x)=1+x+x^2+\cdots x^n\), \(g(x)=1-x+x^2-x^3+\cdots (-1)^{n+1}x^n\) 都是形式幂级数。
多项式可以看做形式幂级数的子集,只有有限项。
\([x^n]f(x)\)\(f(x)=\sum_{n\ge0}a_nx^n\)\(n\) 项系数 \(a_n\)

声明

下面所有内容并不保证十分严谨,仅适合初学者了解。
并不会解释诸如形式幂级数收不收敛,为什么占位符被当做变量一样的问题。
诸如这是定义在一个环上的运算之类的作者并不会。

我们希望通过形式幂级数的封闭形式来获得原问题的一种计算方式。
记数列 \(\{a_n\}\) 的对应形式幂级数为 \(A(x)\) , \(\times\) 表示卷积。
下面可能会将形式幂级数看做变量或多项式处理,并不会严谨证明,人是无法说出自己并不了解的事情的。

普通生成函数(OGF)

\(f(x)=\sum_{n\ge0}a_nx^n\) 为数列 \(\{a_n\}\) 的普通生成函数 \((OGF)\)
容易发现,如果 \(c_n=\sum_{i=0}^{n}a_i b_{n-i}\) ,那么 \(C(x)=A(x)\times B(x)\)

一些常用的 \(OGF\) 如下:
(建议记住)

\[\begin{align*} 1+x+x^2+x^3+\cdots+x^n&=\frac{1}{1-x}\\ 1+x+x^2+x^3+\cdots+x^{m-1}&=\frac{1-x^m}{1-x} \text{m 为有限数}\\\end{align*} \]

上面两个式子的证明只需要把右侧分母乘过来,然后发现确实成立。

组合意义为,从若干组中无序选出若干个元素。
举个例子才能更好地理解这个有什么用。

应用

求解线性递推通项公式

举个例子,数列的前两项为 \(f_0, f_1\) ,对于 \(n\ge 2\) , \(f_n=2f_{n-1}+3f_{n-2}\)
求通项公式。

\(F(x)=\sum_{n\ge0}f_nx^n\)
则有:

\[\begin{align*} F(x)&=\sum_{n\ge0}f_nx^n\\ &=f_0+f_1x+\sum_{n\ge2}f_nx^n\\ &=f_0+f_1x+\sum_{n\ge2}(2f_{n-1}+3f_{n-2})x^n\\ &=f_0+f_1x+\sum_{n\ge2}2f_{n-1}x^n\sum_{n\ge2}3f_{n-2}x^n\\ &=f_0+f_1x+2x\sum_{n\ge1}f_nx^n+3x^2\sum_{n\ge0}f_nx^n\\ &=f_0+f_1x+2x(F(x)-f_0)+3x^2F(x)\\ \end{align*} \]

移项化简得:

\[\begin{align*} F(x)&=\frac{f_0+(f_1-2f_0)x}{1-2x-3x^2}\\ &=\frac{A}{1+x} + \frac{B}{1-3x} \end{align*} \]

\(A(1-3x)+B(1+x)=f_0+(f_1-2f_0)x\) ,解得 :

\[\begin{cases} A=\frac{3f_0-f_1}{4} \\ B=\frac{f_0+f_1}{4} \end{cases} \]

又根据

\[\frac{1}{1+x}=1-x+x^2-x^3+\cdots+(-1)^n x^n\\ \frac{1}{1-3x}=1+3x+9x^2+27x^3+\cdots+3^n x^n \]

所以, \([x^n]=(-1)^nA + 3^nB\)

维护方案数

分组

\(k\) 个集合,从第 \(i\) 个集合中选出 \(k\) 个物品的贡献为 \(v_{i,j}\)
则第 \(i\) 个集合的 \(OGF\)\(F_i(x)=\sum_{k\ge0}v_{i,k}x^k\)
总共选出 \(n\) 个元素的所有方案总贡献为 \([x^n]\prod_{i}F_i(x)\)

背包

每个物品看做一组。
\(f_n=\text{选出重量恰好为 n 的方案数}\)
那么,每件物品的 \(OGF\)\(F_i(x)=1+x^{w_i}\)
那么,总方案数就是 \([x^W]\prod_{i}F_i(x)\)

抽奖机

(无题源)

每次按下抽奖机按钮,有 \(p\) 的概率弹出一个彩蛋, \(1-p\) 的概率关机,每个彩蛋有 \(\frac{1}{2}\) 的概率中奖,获得一个奖品。
问抽奖机关机时,恰好获得 \(k\) 个奖品的概率。

点击查看

推式子:

\[\begin{align*} P(\text{恰好获得 k 个奖品})&=\sum_{i\ge0}p^i(1-p)\binom{i}{k}(\frac{1}{2})^i \text{枚举进行了几次后关机}\\ &=(1-p)\sum_{i\ge0}(\frac{p}{2})^i\ [x^k](1+x)^i \text{二项式定理}\\ &=(1-p)[x^k]\sum_{i\ge0}(\frac{p}{2}+\frac{px}{2})^i\\ &=(1-p)[x^k]\frac{1}{1-\frac{p}{2}-\frac{px}{2}}\\ &=\frac{1-p}{1-\frac{p}{2}} [x^k]\frac{1}{1-\frac{p}{2-p}x}\\ &=\frac{1-p}{1-\frac{p}{2}} (\frac{p}{2-p})^k \end{align*} \]


P10780 BZOJ3028 食物


\(\boldsymbol{无序选出}\) \(n\) 个食物的方案数。

点击查看

\(f_x\) 表示某种食物选择 \(x\) 个的方案数。
\(F(x)=\sum_{n\ge 0}f_nx^n\)
\(ans=[x^n]\Pi F_c(x)\)

下面写出每种食物对应的 \(F(x)\)

\[\begin{align*} &\text{承德汉堡:} 1+x^2+x^4+\cdots+x^2n=\frac{1}{1-x^2}\\ &\text{可乐/土豆片炒肉:}1+x=\frac{1-x^2}{1-x}\\ &\text{鸡腿:}1+x+x^2=\frac{1-x^3}{1-x}\\ &\text{包子:}1+x+x^2+x^3=\frac{1-x^4}{1-x}\\ &\text{蜜桃多:}x+x^3+x^5+\cdots x^{2n-1}=\frac{x}{1-x^2}\\ &\text{面包:}1+x^3+x^6+\cdots+x^{3n}=\frac{1}{1-x^3}\\ &\text{鸡块:}1+x^4+x^8+\cdots+x^{4n}=\frac{1}{1-x^4}\\ \end{align*} \]

全部相乘化简得到 \(ans=[x^n]\frac{x}{(1-x)^4}\)

根据组合意义插板法得:

\[\begin{align*} [x^n](\frac{1}{(1-x)^m})&=\binom{n+m-1}{m-1}\\ ans&=\binom{n+2}{3} \end{align*} \]


P6189 [NOI Online #1 入门组] 跑步

求将一个正整数 \(n\) 划分成若干个正整数之和的方案数。
(我们只关心划分成了哪些数,而不关心它们的顺序)

点击查看

先来介绍一些前置知识。

  • (广义)五边形数
    下图是五边形数。


(图片来自百度)

容易发现通项公式, \(f(n)=\frac{3n^2-n}{2}\)

下面来介绍广义五边形数,就是将 \(0,1,-1,2,-2\cdots\) 依次代入上式后得到的数列:

\[0, 1, 2, 5, 7, 12\cdots \]

我们用 \(p_n\) 表示。

  • 欧拉函数(不是数论里那个)

\[\phi(x)=\prod_{k=1}^{+\infty}(1-x^k) \]

  • 五边形数定理

\[\phi(x)=\sum_{-\infty}^{+\infty}(-1)^kx^{\frac{3k^2-k}{2}} \]

发现 \(x\) 的指数上就是我们刚才定义的广义五边形数,定理名由此而来。
这定理第一次由欧拉证明。

下面来求解问题。
\(f(n)\) 为将 \(n\) 拆分成正整数之和的方案数。

\[\begin{align*} f(n)&=[x^n]\prod_{i\ge1}(1+x^i+x^{2i}+\cdots+x^{ki})\text{枚举 i 选了几个}\\ &=[x^n]\prod_{i\ge1}\frac{1}{1-x^k}\\ &=[x^n]\frac{1}{\phi(x)}\end{align*} \]

所以我们需要求解 \(\phi(x)\) 的逆,可以当做多项式来求逆。
因为常数项为 \(1\) ,所以逆的常数项为 \(1\)
然后,从低到高确定每一位的系数,具体地,只需要将次数更低的结果算出来取负即可。
因为 \(\phi(x)\) 的指数 \(O(n^2)\) 级别的,所以 \(phi(x)\) 只有 \(O(\sqrt n)\) 项系数非负。


#include <bits/stdc++.h>
#define lep(i, a, b) for (int i = a; i <= b; ++i)
#define rep(i, a, b) for (int i = a; i >= b; --i)const int _ = 2e5 + 7;
typedef long long ll;ll n, mod, p[_];ll _5(ll k) { return (3 * k * k - k) / 2; }int main() {scanf("%lld%lld", & n, & mod);p[0] = 1;lep(i, 1, n) {int j = 0, op = 1;while (++j) {int x = _5(j), y = _5(-j);if (x <= i) p[i] = (p[i] + op * p[i - x]) % mod;if (y <= i) p[i] = (p[i] + op * p[i - y]) % mod;if (x > i or y > i) break; op *= -1;}}p[n] = (p[n] + mod) % mod;printf("%lld\n", p[n]);return 0;
}

指数生成函数 (EGF)

\(f(x)=\sum_{n\ge0}\frac{a_n}{n!}x^n\) 为数列 \(\{a_n\}\) 的指数生成函数 \((EGF)\)

\(c_n=\binom{n}{i}a_ib_{n-i}\) 时满足 \(C(x)=A(x)\times B(x)\)
容易验证:

\[\begin{align*} c_n&=\binom{n}{i}a_ib_{n-i}\\ c_n&=\frac{n!}{i!(n-i)!}a_ib_{n-i}\\ \frac{c_n}{n!}&=\frac{a_i}{i!}\times \frac{b_{n-i}}{(n-i)!}\end{align*} \]

组合意义为,从若干组中选出若干个元素并有序排列。
容易发现, \(\binom{n}{i}\) 是在给 \(A\) 中的元素选择位置。

在这里指出两个函数的幂级数:

\[\begin{align*} \exp(x)&=\sum_{n\ge0}\frac{1}{n!}x^n\\ \ln(1+x)&=\sum_{n\ge1}(-1)^{n+1}\frac{1}{n}x^n \end{align*} \]

应用

分组

\(k\) 个集合,从第 \(i\) 个集合中选出 \(k\) 个物品的贡献为 \(v_{i,j}\)
则第 \(i\) 个集合的 \(EGF\)\(F_i(x)=\sum_{k\ge0}\frac{v_{i,k}}{k!}x^k\)
总共选出 \(n\) 个元素并有序排列的所有方案总贡献为 \(n![x^n]\prod_{i}F_i(x)\)

错位排序

满足 \(\forall\) \(i\) , \(i\ne p_i\) 的排列 \(p\) 的个数。

点击查看

错位排序可以看做若干个置换环。
每个大小为 \(c\) 的置换环贡献为 \((c-1)!\)
(其实就是环排列)
定义每个环的 \(EGF\)\(F(x)=\sum_{c\ge 2}\frac{(c-1)!}{c!}x^c=\sum_{c\ge 2}\frac{1}{c}x^c\)

进一步化简得到:

\[\begin{align*} F(x)&=-x-\sum_{i\ge1}\frac{1}{i}x^i\\ &=-x-\ln(1-x) \end{align*} \]

所以:

\[\begin{align*} ans&=[x^n]n!\sum_{k\ge 0}\frac{F^k(x)}{k!}\text{枚举选了几组,并且我们并不关心组之间的顺序}\\ &=[x^n]n!\exp(F(x))\text{n!是抵消EGF时的系数}\\ &=[x^n]n!\exp(-x-\ln(1-x))\\ &=[x^n]n!\exp(-x) \times \frac{1}{1-x}\\ &=[x^n]n!\sum_{n\ge0}\frac{(-1)^n}{n!}x^n\times \sum_{n\ge0}x^n \end{align*} \]

相当于 \(e^{-x}\) 的系数前 \(n\) 项做前缀和后再乘 \(n!\)
容易发现这就是错位排列的通项公式:

\[D(n)=n!\sum_{i=0}^n\frac{(-1)^n}{n!} \]


Chocolate

将长度为 \(n\) 的序列染上 \(c\) 种颜色,恰好有 \(m\) 种颜色出现奇数次的概率。

点击查看

记某种颜色出现奇数次的 \(EGF\)\(O(x)\) ,出现偶数次的 \(EGF\)\(E(x)\)

\[O(x)=\frac{1}{1!}x+\frac{1}{3!}x^3+\cdots=\frac{e^x-e^{-x}}{2}\\ E(x)=\frac{1}{0!}1+\frac{1}{2!}x^2+\cdots=\frac{e^x+e^{-x}}{2}\\\begin{align*} ans&=\frac{\binom{c}{m}n!}{c^n}[x^n]O^m(x)E^{c-m}(x)\text{左侧系数自行思考}\\ &=\frac{\binom{c}{m}n!}{c^n}[x^n](\sum_{i=0}^{m}\binom{m}{i}(-1)^{m-i}(\frac{e^x}{2})^i(\frac{e^{-x}}{2})^{m-i})(\sum_{j=0}^{c-m}\binom{c-m}{j}(\frac{e^x}{2})^j(\frac{e^{-x}}{2})^{c-m-j})\text{二项式展开}\\ &=\frac{\binom{c}{m}n!}{2^cc^n}[x^n]\sum_{i=0}^{m}\sum_{j=0}^{c-m}(-1)^{m-i}\binom{m}{i}\binom{c-m}{j}e^{x(2i+2j-c)}\text{化简}\\ &=\frac{\binom{c}{m}n!}{2^cc^n}\sum_{i=0}^{m}\sum_{j=0}^{c-m}(-1)^{m-i}\binom{m}{i}\binom{c-m}{j}[x^n](\sum_{n\ge0}\frac{1}{n!}(2i+2j-c)^nx^n)\\ &=\frac{\binom{c}{m}n!}{2^cc^n}\sum_{i=0}^{m}\sum_{j=0}^{c-m}(-1)^{m-i}\binom{m}{i}\binom{c-m}{j}\frac{1}{n!}(2i+2j-c)^n\\ &=\frac{\binom{c}{m}}{2^cc^n}\sum_{i=0}^{m}\sum_{j=0}^{c-m}(-1)^{m-i}\binom{m}{i}\binom{c-m}{j}(2i+2j-c)^n \end{align*} \]

\(O(c^2)\) 暴力计算即可。


http://www.kefakeji.com/news/892.html

相关文章:

  • 图灵奖和诺贝尔奖双料得主、AI教父Hinton:AI超越人类后,我们该怎么做
  • ICCV 2025 | 浙大等提出 SGCDet:自适应3D体素构建,重新定义多视图室内3D检测
  • 国产GPU芯片的天花板来啦!打破一切质疑,现场4K全高画质流畅跑黑猴!!!
  • 当AI教父都开始害怕AI
  • 共生伙伴:2025人工智能十大趋势|2025 WAIC报告重磅发布
  • 数据泄露激增与防护策略详解
  • 20250728
  • 白话Docker系列(一):用Web应用实例深入容器
  • 用 Vite + Cloudflare Pages 实现模块级独立打包与部署的静态 CDN 分发
  • [07.27学习笔记] Tokenizer - Luna
  • STM32F103C8T6芯片介绍(下) - LI,Yi
  • GRUB 设置安全启动
  • 【work记录】系统能力大赛数据库中的MVCC学习记录
  • FireStore如何查看空间占用情况?(未解决)
  • MIT6.s081_Lab8
  • 关于同源策略和跨域请求
  • Codeforces Round 1039 (Div. 2) 1 ~ D
  • 【转】[C#] 参数前加 in 的作用
  • 循环链表实现的队列
  • Codeforces Round 1039 (Div. 2)(A~E1)
  • 关于博客主题的一些思考
  • PG故障处理:PG_AUTO_FAILOVER自动切换失败的故障处理
  • Codeforces Round 1039 (Div. 2)
  • 21天
  • 【转】[C#] Enum 的 Flags 特性
  • 白嫖claude code的100美元额度,anyrouter中转服务
  • 2025.7.27 东师集训测试总结
  • POLIR-Laws-电商交易: 三方的法律关系确定: 网络交易双方与网络交易平台三者之间的法律关系
  • Umi-OCR完全指南:开源离线OCR识别软件下载安装使用教程|支持批量PDF/二维码识别
  • Docker