食物111

给定一个有穷或者让无穷数列{ a 0 , a 1 , . . . a_0,a_1,... a0,a1,...},则称 g ( x ) = a 0 + a 1 x + a 2 x 2 + . . . ( − 1 < x < 1 ) g(x)=a_0+a_1x+a_2x^2+...(-1<x<1) g(x)=a0+a1x+a2x2+...(1<x<1)为原数列的一个生成函数

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

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

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

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

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

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

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

不难知道 f i ( x ) = ( 1 + x + x 2 + . . . ) = 1 1 − x f_i(x)=(1+x+x^2+...)=\frac{1}{1-x} fi(x)=(1+x+x2+...)=1x1,于是 f ( x ) = ∏ i = 1 n f i ( x ) f(x)=\overset{n}{\underset{i=1}{\prod}}f_i(x) f(x)=i=1nfi(x)

用组合数学的角度看问题,即 x 1 + x 2 + . . . + x n = n + k ( x i ≥ 1 ) x_1+x_2+...+x_n=n+k(x_i≥1) x1+x2+...+xn=n+k(xi1),隔板法求得为 C n + k − 1 n − 1 C_{n+k-1}^{n-1} Cn+k1n1,也就是说 f ( x ) f(x) f(x)展开式 x k x^k xk对应的系数就是 C n + k − 1 n − 1 C_{n+k-1}^{n-1} Cn+k1n1(这也就是OI-wiki封闭形式五)

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

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

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值