定义

又称母函数
是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。

母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。

普通母函数

定义:

【持续更新】生成函数学习笔记_题组

性质

操作

放缩

【持续更新】生成函数学习笔记_题组_02
加减法

【持续更新】生成函数学习笔记_题组_03
右移(右移k位=在前面补k个0)

【持续更新】生成函数学习笔记_题组_04
求导(左移一位,系数乘以下标)

【持续更新】生成函数学习笔记_题组_05
卷积规则

【持续更新】生成函数学习笔记_题组_06
【持续更新】生成函数学习笔记_题组_07

1/(1-x)m
【持续更新】生成函数学习笔记_题组_08
那么 g(x)xn 的系数gn就是x1+x2+…+xm=n的非负整数解个数,显然通过插板法得gn=C(m+n-1,m-1)

【持续更新】生成函数学习笔记_题组_09

指数母函数

定义

【持续更新】生成函数学习笔记_题组_10
该函数符合上述卷积规则

性质

<1,1,1,1……>
【持续更新】生成函数学习笔记_题组_11
Taylor展开得
【持续更新】生成函数学习笔记_题组_12
x0=0,f(x)=ex

【持续更新】生成函数学习笔记_题组_13
<1,1,1……> 的闭形式为 ex
【持续更新】生成函数学习笔记_题组_14
左移右移
通过求导

卷积
【持续更新】生成函数学习笔记_题组_15
(图片摘自一些论文)

例题

HDU1028

可以看做每一个数都可以无限取
于是生成函数为:
(1+x+x2+x3….)(1+x2+x4+….)……(1+xn)

#include<bits/stdc++.h>
using namespace std;
const int N=277;
int f[N],g[N];
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0; i<=n; i++) f[i]=1,g[i]=0;
		for(int i=2; i<=n; i++)
		{
			for(int j=0; j<=n; j++) for(int k=0; k+j<=n; k+=i)
				g[k+j]+=f[j];
			for(int j=0; j<=n; j++) f[j]=g[j],g[j]=0;
		}
		printf("%d\n",f[n]);
	}
}

HDU2110

#include<bits/stdc++.h>
using namespace std;
int n,yjy[105],aii[105],m,f[10010],g[10010];
int main()
{
		while(~scanf("%d",&n),n)
		{
				m=0;
				for(int i=0; i<n; i++)
				{
						scanf("%d%d",&yjy[i],&aii[i]);
						m+=(yjy[i]*aii[i]);
				}
				if(m%3!=0)
				{
						printf("sorry\n");
						continue;
				}
				memset(f,0,sizeof(f));
				memset(g,0,sizeof(g));
				m/=3;
				for(int i=0; i<=aii[0]&&i*yjy[0]<=m; i++)
				{
						f[i*yjy[0]]=1;
				}
				for(int i=1; i<n; i++)
				{
						for(int j=0; j<=m; j++)
								for(int k=0; k<=aii[i]&&k*yjy[i]+j<=m; k++)
								{
										g[k*yjy[i]+j]+=f[j];
										g[k*yjy[i]+j]%=10000;
								}
								for(int j=0; j<=m; j++)
								{
										f[j]=g[j];
										g[j]=0;
								}
				}
				if(f[m]!=0)
				{
						printf("%d\n",f[m]);
				}
				else printf("sorry\n");
		}
}