指数型生成函数
我们知道普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题
对于数列{an},我们定义其指数型生成函数为
G(x)=a0+a1x+a2x22!+a3x33!+a4x44!+⋯=∞∑i=0aixii!
那么对于两个数列{an}和{bn},其对应成生成函数为
G(x)=∞∑i=0aixii!
F(x)=∞∑i=0bixii!
那么
F(x)⋅G(x)=(∞∑i=0aixii!)(∞∑i=0bixii!)=∞∑n=0(∞∑i=0aixii!⋅bn−ixn−i(n−i)!)xn=∞∑n=0(∞∑i=0(ni)aibn−i)xnn!
由此可见两个指数型生成函数相乘,如果xi的系数表示的是选择i个该物品的方案数,那么F(x)⋅G(x)的xi的系数表示的就是从a和b中选出i个物品的排列数
一般地,对于多重集合M,从中选取k个元素的排列数,若限定元素ai出现的次数集合为Mi,则该组合数序列的生成函数为
n∏i=1(∑m∈Mixmm!)
泰勒展开式
通常,在指数型生成函数的使用过程中,一般都会用到泰勒展开式:
ex=∞∑i=0xii!=1+x+x22!+x33!+x44!+⋯+xnn!+…
扩展的一些式子:
ex+e−x2=∞∑i=0x2i(2i)!
ex−e−x2=∞∑i=0x2i+1(2i+1)!
还有一些比较有用的公式:
11−x=∞∑i=0xi
ln(1+x)=∞∑i=0(−1)ixi+1i+1
(1+x)a=∞∑i=0ai–xii!
sin(x)=∞∑i=0(−1)ix2i+1(2i+1)!
cos(x)=∞∑i=0(−1)ix2i(2i)!
多项式求ln
意义?
我们要求将一个集合大小为n的方案数,逆向思考
假如我们求出了生成函数F(x),其中xi项的系数表示集合大小为i的方案数
我们构造一个函数
G(x)=F(x)1!+F2(x)2!+F3(x)3!+…
观察式子发现G(x)中xi的系数实际上就是选出若干集合大小刚好为i的方案数
假设这个方案数很好求,我们能很快构造出G(x),我们现在要求F(x)的话就要使用多项式求ln了
观察
G(x)=F(x)1!+F2(x)2!+F3(x)3!+⋯=eF(x)
则
F(x)=lnG(x)
求法
假如我们要求G(x)=lnF(x)
求导得
G′(x)=F′(x)F(x)
则
G(x)=∫F′(x)F(x)dx
所以我们只需多项式求导,多项式求逆,多项式乘法,多项式积分
复杂度O(nlogn)
例题BZOJ3456城市规划
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】