生成函数GeneratingFunction

生成函数GeneratingFunction

极限

对于
存在
极限:ϵ,N,N>n,|anA|<ϵ
就是说,对于所有(任意小的非负整数)ϵ存在N,使得an与A的差值小于ϵ
我们就把A叫做此序列的极限limnan=A

有限数列没有极限!

若数列中的值全部相同的也没有极限!

{1,12,13,14,...}0

{1,0,0,0,0,0,...}的极限是0

导数

To be continued:D

泰勒公式

To be continued:D

生成函数

如何简短的表示一个序列呢?
{1,1,1,1,1,1,1,...}
我们以一多项式来表达,以x的指数为下标,系数为值,就可以得到
A={1x0,1x1,1x2,1x3,...}

A={1,x,x2,x3,...}
注意,这个序列的长度是无限的

A=1+x+x2+x3+...xA=x+x2+x3+...(1x)A=1A=11x

11x就是生成这个序列的函数,也就是说,它就是生成函数

类似的,可以得到:

21x=2,2,2,2,2,2...11+x=1x+x2x3...=1,1,1,1,...112x=1+2x+4x2+8x3...=1,2,4,8,...

当然,生成函数支持加法和乘法(上面已经有例子了)

11+x+11x=21x21,1,1,1,...+1,1,1,1,...=2,0,2,0,...11x2=1,0,1,0,...x1x2=11x11x2=0,1,0,1,...

还有

A=1+3x+5x2+7x3+...xA=1x+3x2+...(1x)A=1+2x+2x2+...21x=2+2x2+...2x1x=2x+2x2+...1+2x1x=1+2x+2x2+...(1x)A=1+2x1xA=1+2x1x1x=1+x(1x)2

B=1+4x+9x2+16x3+25x5+...xB=1x+4x2+9x3+...(1x)B=1+3x+5x2+...(1x)B=A=1+x(1x)2(1x)B=1+x(1x)3

如何生成有限数列呢?

A=1,x,x2,x3,...x4A=x4+x5+x6+...(1x4)A=1+x+x2+x3A=11x(1x4)×11x=1x41x=1+x+x2+x3

如果对生成函数求导会如何?

(11x)=1(1x)2=1+2x+3x2+4x4+...(11x)=1(1x)3=1+3x+6x2+10x4+15x5+...

这里旨在于告诉你很多数列均可以用生成函数表示

此外的

F=1+1x+2x2+3x3+5x4+...F=11xx21xx2=0x1=1+52,x2=1521xx2=(1x1)×(1x2)F=11xx2=a1x1+b1x2...Tobecontinued:D

当然,普通生成函数的用处不止于此

有一些水果,求选苹果偶数个,选梨5的倍数个,橘不超过4个,桃最多一个,求选共n个水果的方案数

这咋办?还好,我们有生成函数!

众所周知,普通生成函数的乘积就是组合数(你又知道?)
我们让i次项系数作为组合数

C=A+B=n=0(ai+bi)xnC=A×B=n=0i=0n(aib(ni))xncn=i=0n(aib(ni))xn

故得i次项系数即为相加为i的生成函数的所有方案数

苹果的生成函数:1+x2+x4+x6+...=11x2
梨:1+x5+x10+...=11x5
橘:1+x+x2+x3+x4=1x51x
桃:1+x=1x21x
相乘求组合,11x2×11x5×1x51x×1x21x=1(1x)2
发现恰为1+2x+3x2+4x4+...所以输出n即可
6!

但是,并不是所有题目都如此凑巧,我们还得算(1+x2+x4+x6+...)×(1+x5+x10+...)×...

所以,我们将给出一个模板,旨在于做上面的小乘法

//这里是一个用背包装物品的模板

c1[0]=1,l1=0;
//x[i]-->物品大小
//y[i]-->物品个数
for (int i = 1; i <= n; i++)//遍历物品
{
    l2 = l1 + x[i] * y[i];//预计的最高次数
    memset(c2, 0, sizeof(int) * (l2 + 1));//清空
    for (int j = 0; j <= y[i] && j * x[i] <= l2; j++)
        //当然,如果物品无限多不需要判断j <= y[i]
        for (int k = 0; k <= l1 && j * x[i] + k <= l2; k++)
            c2[j * x[i] + k] += c1[k];
    memcpy(c1, c2, sizeof(int) * (l2 + 1));//储存计算结果
    l1 = l2;
}
//最后,c1[n]表示装满大小k的背包的方案数

其实,看到这你也能发现,它可以用背包实现,但与背包相比,生成函数可快
普通生成函数只能解决组合问题!!!

指数生成函数

普通生成函数只能解决组合问题!!!

但是指数生成函数可以解决排列问题:D

To be continued:D

posted @   ssj_233  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示