母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。
我们首先来看下这个多项式乘法:
由此可以看出:
1. x的系数是a1,a2,…an的单个组合的全体。
2. x2的系数是a1,a2,…a2的两个组合的全体。
………
n. xn的系数是a1,a2,….an的n个组合的全体(只有1个)。
由此得到:
母函数的定义:
对于序列a0,a1,a2,…构造一函数:
称函数G(x)是序列a0,a1,a2,…的母函数
hdu 1085
#include<iostream>
#include<cmath>
using namespace std;
int a[10000],b[10000];
int p[3]={1,2,5};
int main()
{
int i,j,k,sum,t;
int num[3];
freopen("d:\\input.txt","r",stdin);
while(cin>>num[0]>>num[1]>>num[2] && (num[0]!=0 || num[1]!=0 || num[2]!=0))
{
sum=num[0]+num[1]*p[1]+num[2]*p[2];
if(num[0]==0)
cout<<1<<endl;
else
{
for(i=0;i<=sum+1;i++)
{
a[i]=0;
b[i]=0;
}
for(i=0;i<=num[0];i++)
{
a[i]=1;
}
for(i=1;i<=2;i++)
{
for(j=0;j<=sum;j++)
{
if(a[j]==0)
continue;
for(k=0,t=0;k+j<=sum && t<=num[i];k+=p[i],t++)
{
b[k+j]+=a[j];
}
}
for(j=0;j<=sum;j++)
{
a[j]=b[j];
b[j]=0;
}
}
for(i=1;i<=sum+1;i++)
if(a[i] == 0)
break;
cout<<i<<endl;
}
}
return 0;
}