生成函数简介
定义#
序列 AA 的生成函数(又称母函数,generating function),是一种形式幂级数,其每一项的系数都可以提供关于 AA 的信息。
形式幂是指,无论函数的自变量的取值是多少,都不影响原序列的信息。
常用的有普通生成函数和指数生成函数。
生成函数经常被用于处理组合/排列问题。
普通生成函数#
开放形式#
我们看这样一个模型:
有三堆颜色不同的球,分别为 A,B,CA,B,C。其中,AA 有 3 个,BB 有 4 个,CC 有 2 个。问从中取出 4 个球进行组合的方案数是多少?
我们定义多项式 A(x)=1+x+x2A(x)=1+x+x2,系数表示 1 种方案,指数表示取几个。B,CB,C 同理。
那么最后的答案即为 A∗B∗C(x)A∗B∗C(x) 的第 4 项上的系数。因为第 4 项的系数表示取 4 个的方案数。
可以乘起来的原因是多项式乘法的本质是乘法分配律后同阶相加。
我们称形如 F(x)=∑ni=0aixiF(x)=∑ni=0aixi 为序列 [a1,a2,…,an][a1,a2,…,an] 的普通生成函数。
再来一个例子:
若有面值为 1,2,3,41,2,3,4 的钱币各 1 枚,请问一共能凑出多少种面值?
(1+x)(1+x2)(1+x3)(1+x4)(1+x)(1+x2)(1+x3)(1+x4) 的项数即为答案。如果至少去一个就去掉常数项。
封闭形式#
我们在实际运用中,直接做形式幂级数的形式十分不方便。我们可不可以找到一个简洁的形式使其脱离多项式,尤其是项数 →∞→∞ 的时候。
我们拿 [1,1,1,…][1,1,1,…] 的生成函数 F(x)=∑i⩾0xiF(x)=∑i⩾0xi 来举例:
或者直接使用等比数列求和公式可以得到:
当 n→∞ 时,xn→0。
亦或者等比数列 [1,a,a2,a3,…] 的生成函数 F(x)=∑i⩾0aixi:
这里列举一些:
我们一般先将初始的几个函数转成封闭形式,乘起来后再转回开放形式得到答案。
指数生成函数#
普通生成函数可以用来解决组合问题,而指数生成函数可以用来解决排列问题。
多重集排列数#
多重集是指包含重复元素的广义集合。我们设 S=a1n1,a2n2,…,annn,则 S 的全排列个数为 n!a1!a2!…an!。
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 还在手写JSON调教大模型?.NET 9有新玩法
· 复杂业务系统线上问题排查过程
· 通过抓包,深入揭秘MCP协议底层通信
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· Coze Studio:字节跳动 Coze 的开源版本来了!第一时间深度解析
· 一款超级经典复古的 Windows 9x 主题风格 Avalonia UI 控件库,满满的回忆杀!
· 我给 AI 接上了一个 C# 运行器,结果它学会了自己上网、调试代码
· AI再强大,也不如人类员工用的爽?
· 我只说需求,AI 全程托管,代码自己长出来了!