【模板】母函数(生成函数)

来源:互联网 发布:js 分割字符串 编辑:程序博客网 时间:2024/05/18 00:09

什么是母函数呢?我还是咨询一下百度百科吧。

定义:
对于任意数列a0,a1,a2...an 即用如下方法与一个函数联系起来:
~G(x) = a0 + a1x + a2x^2 + a3x^3 +....+ anx^n
则称G(x)是数列的生成函数(generating function)
例子:
比较典型的是:A(x) = (1+x)^n~C(n,0),C(n,1),C(n,2),C(n,3),.....,C(n,n)
我理解的母函数是这个意思:

比如:有两种类型的纸币1元和5元分别为两张和三张。则他们的总共组合有这样几种情况。

(1+2x)*(1+3x^5)。

解释一下(1+2x),x的指数指的是1元价值的纸币,其x的系数是取其1元(也就是指数)有多少种方式。乘出来的式子也能用这种方式去解释。

然后就是母函数的求法了。有种背包的思想在里面,先把第一个式子(也可理解为第一种情况)加入背包中c1[i]。i表示取i有c1[i]种方法,一般初始都是1种。c1[0]也要注意初始化为1.然后从第二个式子开始背包处理,能够塞入背包的就加上前面情况种数。临时开一个数组存放数据,也就是c2[k+j]+=c1[j].每加上一个式子便将值更新至c1中,并将c2清零。

#include<iostream>#include<stdio.h>using namespace std;int main(){    int N;    int c1[125],c2[125];    while(cin>>N)    {        int i,j,k;        for(i=0;i<=N;i++)//初始化第一个表达式的系数        {            c1[i]=1;            c2[i]=0;        }        for(i=2;i<=N;i++)        {//从第二个表达式开始,因为有无限制个,所以有n个表达式            for(j=0;j<=N;j++)            {//从累乘的表达式后的一个表达式第一个到最后一个            if (c1[j]) //这个是我自己加的                 for(k=0;k+j<=N;k+=i)                {//k为第j个变量的指数,第i个表达式每次累加i                    c2[j+k]+=c1[j];                }            }            for(j=0;j<=N;j++)            {//滚动数组算完一个表达式后更新一次                c1[j]=c2[j];                c2[j]=0;            }        }        printf("%d\n",c1[N]);    }    return 0;}


0 0