食物

给定一个有穷或者让无穷数列{a0,a1,...},则称g(x)=a0+a1x+a2x2+...(1<x<1)为原数列的一个生成函数

本质就是将问题转换为多项式问题,从而利用多项式的性质去解决问题

一些生成函数的化简见OI-wiki封闭形式

例题:现有1g,2,g,3g的砝码各一个,问能称出多重的物品,以及每个重量的物品被称出的方法数

我们先用DP的角度看待这个问题,设f[i][j]表示用前i个砝码可以称出重量为j的物品的方案数,则f[i][j]=f[i1][jweight[i]]+f[i1][j]

然后我们再用多项式的角度去看待这个问题,设系ai表示称出重量为i的物品的方案数,此时我们像DP一样,一个阶段一个阶段地考虑问题。对于第一个砝码,有f1(x)=1+x(常数项的系数a01,表示用第一个砝码称出重量为0的物品的方案数是1x的系数a11,表示用第一个砝码称出重量为1的物品的方案数是1);对于前两个砝码有f2(x)=f1(x)(1+x2)=1+x+x2+x3(1+x2)与上面的解释一样,这里之所以要两者乘起来就是利用了多项式相乘指数相加的原理,即f1(x)中的aixiai已经存储了用前一个砝码称出重量为i的物品的方案数,我们现在又知道了用第二个砝码称出重量为j的方案数aj,那么这一个组合对“用前两个砝码称出重量为i+j的物品的方案数”的贡献就是aiaj,此时系数刚好相乘即乘法原理而x的指数相加刚好表示称出i+j的物品的方案数);对于前三个砝码有f3(x)=f2(x)(1+x3)=1+x+x2+2x3+x4+x5+x6。最终得到的这个式子的系数就分别说明了方案数;或者也可以用整体来考虑,直接写出f(x)=(1+x)(1+x2)(1+x3)f(x)的展开式是从三个因子中各选一项来组成的,而三个因子各选一项也就代表了三个砝码的不同选择,相乘时用了乘法原理,合并同类项时用了加法原理

又比如三个砝码的数量分别是2,+,1,那么生成函数就是f(x)=(1+x+x2)(1+x2+x4+x6+...)(1+x3)

另一道例题:现有n个不同的苹果,每种苹果都有无穷多个,选出k个苹果,请求出方案数,要求用生成函数解决这个问题

不难知道fi(x)=(1+x+x2+...)=11x,于是f(x)=i=1nfi(x)

用组合数学的角度看问题,即x1+x2+...+xn=n+k(xi1),隔板法求得为Cn+k1n1,也就是说f(x)展开式xk对应的系数就是Cn+k1n1(这也就是OI-wiki封闭形式五)

理解了上面的过程后,这道题目就非常简单了,具体见OI-wiki的解答就好了

注意化简的过程,最好把有穷级数也写成分数的形式,这样更好化简

posted @   最爱丁珰  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示