首页 > 其他分享 >生成函数初学

生成函数初学

时间:2023-12-06 21:22:59浏览次数:37  
标签:infty 函数 dfrac 生成 cdots 初学 tfrac times

生成函数初学

定义

生成函数:指无穷级数与函数的对应,其中无穷级数表示一个无限的数列的和。

我们定义一个生成函数 \(f(x)\) 是收敛的,当且仅当 \(f(x)\) 随着 \(x\) 的定向变化趋向于一个确定的极限值。如令 \(f(x)=\dfrac{1}{x}\),当 \(x\rightarrow \infty\) 时,\(f(x)=\dfrac{1}{x}\rightarrow 0\),为定值。

同理,与其相反地,我们定义一个生成函数 \(g(x)\) 是发散的,当且仅当 \(g(x)\) 随着 \(x\) 的定向变化趋向于无穷,即 \(g(x)\) 的值没有极限。如 \(g(x)=2x\),\(x\rightarrow \infty\) 时,\(g(x)=2x\rightarrow \infty\)。

生成函数的主要应用是求排列组合

下面以一道例题引入。

有 \(n\) 种物品可供选择,其中第 \(i\) 种物品有 \(c_i\) 个,现在要从中选取 \(k\) 个物品,求方案数。

我们用 \(x_i\) 表示第 \(i\) 个物品。对于第 \(i\) 种物品构造一个式子,形如:

\[{x_i}^0+{x_i}^1+{x_i}^2+\cdots+{x_i}^{c_i} \]

也即:

\[1+{x_i}+{x_i}^2+\cdots+{x_i}^{c_i} \]

第 \(i\) 个式子有 \(c_i+1\) 项,其中式子的第 \(j\) 项表示第 \(i\) 种物品 \(x_i\) 取了 \(j-1\) 个。

我们将取物品的过程看作对每一种物品分开考虑选取再合起来,那么可以将由上述方式得到的 \(n\) 个式子相乘,得到

\[(1+{x_1}+\cdots+{x_1}^{c_1})(1+{x_2}+\cdots+{x_2}^{c_2})\cdots(1+{x_n}+\cdots+{x_n}^{c_n}) \]

因为只考虑选取物品的个数,不考虑选取的物品具体是哪一种,所以所有的角标可以去除,即

\[(1+x+\cdots+x^{c_1})(1+x+\cdots+x^{c_2})\cdots(1+x+\cdots+x^{c_n}) \]

将表达式展开,不难得出 \(x^k\) 项前的系数即为答案。

普通型生成函数

普通型生成函数的一般形式:

\[\begin{aligned} f(x)&=\sum\limits_{i=0}^\infty a_ix^i \\ &=a_0+a_1x+a_2x^2+a_3x^3+\cdots+a_nx^n \end{aligned} \]

令 \(a_i=1\),就得到了最常见的普通型生成函数:

\[\begin{aligned} f(x)&=\sum\limits_{i=0}^\infty x^i \\ &=1+x+x^2+x^3+\cdots \end{aligned} \]

令 \(S=f(x)\),则 \(xS=x+x^2+x^3+x^4\cdots\)

两式相减,得到 \((x-1)S=-1\),故 \(f(x)=S=-\dfrac{1}{x-1}=\dfrac{1}{1-x}\)。

考虑在最常见的普通型生成函数做一些变形。

  • \(x\rightarrow -x\),\(f(x)=\sum\limits_{i=0}^\infty {(-1)^ix^i}=\dfrac{1}{1+x}\);
  • \(x\rightarrow 2x\),\(f(x)=\sum\limits_{i=0}^\infty {2^ix^i}=\dfrac{1}{1-2x}\);

插入:牛顿二项式定理

对任意实数 \(a,b,n\),有

\[(a+b)^n=\sum\limits_{i=0}^n \dbinom{n}{i}a^ib^{m-i} \]

一般来说,使用时通常有 \(b=1\),那么有

\[(x+1)^n=\sum\limits_{i=0}^n\dbinom{n}{i}x^i \]

拓展一下,可以得出

\[\dfrac{1}{(1-x)^n}=\sum\limits_{i=0}^\infty \dbinom{n+i-1}{i}x^i \]

P2000 拯救世界

将题意中的十条限制用式子表示出来,即

\[\begin{cases} 1+x^6+x^{12}+\cdots \\1+x+x^{2}+\cdots+x^9 \\1+x+x^{2}+\cdots+x^5 \\1+x^4+x^{8}+\cdots \\1+x+x^{2}+\cdots+x^7 \\1+x^2+x^4+\cdots \\1+x \\1+x^8+x^{16}+\cdots \\1+x^{10}+x^{20}+\cdots \\1+x+x^2+x^3 \end{cases} \]

这十个式子都可以用等比数列转化形式,相乘可得

\[\tfrac{1}{1-x^6}\times\tfrac{1-x^{10}}{1-x}\times\tfrac{1-x^6}{1-x}\times\tfrac{1}{1-x^4}\times\tfrac{1-x^8}{1-x}\times\tfrac{1}{1-x^2}\times\tfrac{1-x^2}{1-x}\times\tfrac{1}{1-x^8}\times\tfrac{1}{1-x^{10}}\times\tfrac{1-x^4}{1-x} \]

分子部分每一个式子在分母部分都有相同的式子,可以直接约去,最后分母还剩下 \((1-x)^5\)。

所以相当于我们要求 \(\dfrac{1}{(1-x)^5}\) 展开后第 \(n\) 项的系数,即 \(ans=\dbinom{5-1}{n+5-1}=\dbinom{4}{n+4}\)。

指数型生成函数(泰勒级数)

指数型生成函数的一般形式:

\[\begin{aligned} f(x)&=\sum\limits_{i=0}^\infty a_i\tfrac{x^i}{i!} \\ &=a_0+a_1x+a_2\tfrac{x^2}{2!}+a_3\tfrac{x^3}{3!}+\cdots+a_n\tfrac{x^n}{n!} \end{aligned} \]

同样令 \(a_i=1\),可以得到最简单的指数型生成函数,记为 \(e^x\)。

\[\begin{aligned} e^x&=\sum\limits_{i=0}^\infty\tfrac{x^i}{i!} \\ &=1+x+\tfrac{x^2}{2!}+\cdots+\tfrac{x^n}{n!} \end{aligned} \]

拓展一下,不难得出

  • \(e^{-x}=1-x+\tfrac{x^2}{2!}-\tfrac{x^3}{3!}+\tfrac{x^4}{4!}\cdots\)
  • \(\dfrac{e^x+e^{-x}}{2}=1+\tfrac{x^2}{2!}+\tfrac{x^4}{4!}+\tfrac{x^6}{6!}+\cdots\)
  • \(\dfrac{e^x-e^{-x}}{2}=x+\tfrac{x^3}{3!}+\tfrac{x^5}{5!}+\cdots\)

考虑这样一个问题。

给定 \(n\) 个集合,现在要分别从集合 \(1,2,\cdots n\) 中分别取出 \(k_i\) 个数。记 \(K=\sum k_i\),将选出的 \(K\) 个数构成排列,求方案数。

同样对每一个集合用一个式子表示,但每一个集合中选取的数要求无序。故对于第 \(i\) 个集合,用以下式子表示:

\[\tfrac{x_i^0}{0!}+\tfrac{x_i^1}{1!}+\tfrac{x_i^2}{2!}+\cdots+\tfrac{x_i^{k_i}}{{k_i}!} \]

也即

\[1+x_i+\tfrac{x_i^2}{2!}+\cdots+\tfrac{x_i^{k_i}}{{k_i}!} \]

同样做乘法,取第 \(K\) 项的系数,但这只是选数的方案数,还需乘上 \(K!\) 得到排列数。

hdu - 2065

AC 两个字符只能出现偶数次,生成函数为 \(\dfrac{e^x+e^{-x}}{2}\)。

BD 两个字符只能出现偶数次,生成函数为 \(e^x\)。

乘起来就是

\[\begin{aligned} & e^x\times e^x\times \dfrac{e^x+e^{-x}}{2}\times \dfrac{e^x+e^{-x}}{2} \\&=\dfrac{e^{4x}+2e^{2x}+1}{4} \end{aligned} \]

然后计算第 \(n\) 项的系数,为 \(\dfrac{4^n+2\times 2^n}{4}=4^{n-1}+2^{n-1}\)

练习

poj - 3734

poj - 1322

poj - 1014


标签:infty,函数,dfrac,生成,cdots,初学,tfrac,times
From: https://www.cnblogs.com/ereoth/p/17880562.html

相关文章

  • 无涯教程-Erlang - list_to_tuple函数
    此方法是将列表转换为元组。list_to_tuple-语法list_to_tuple(list)list - 这是需要转换为元组的列表。list_to_tuple-返回值根据提供的列表返回一个元组。-module(helloLearnfk).-export([start/0]).start()->io:fwrite("~w",[list_to_tuple([1,2,3])])......
  • 函数循环
    for循环for(初始化语句A;boolean类型表达式B;更改表达式C){循环体,就是需要被重复执行的代码;D}执行顺序:for-->A-->B-->|false:循环到此结束|true-->D-->C-->B死循环:boolean类型值恒为真for循环中boolean类型表达式如果未定义,默认true死循环后面不能有代码注意:fo......
  • 无涯教程-Erlang - is_tuple函数
    此方法用于确定所提供的术语确实是元组。is_tuple-语法is_tuple(tuple)tuple-这是要验证的元组是否真的是元组。is_tuple-返回值如果确实输入的值是元组,则返回true,否则将返回false。-module(helloLearnfk).-export([start/0]).start()->P={john,24,{june,2......
  • SQL的CAST() 函数
    简述在HiveSQL中,CAST()函数用于将一个数据类型转换为另一个数据类型。它可以用于将数值转换为字符串,也可以进行其他数据类型之间的转换。基本语法CAST(expressionASdata_type)mysql常见的数据类型示例:(hivesql当中不一定完全相同)CHAR(n):固定长度的字符串,最大长度为n。V......
  • 无涯教程-Erlang - keys函数
    此方法用于从Map返回所有键。keys-语法keys(map)map - 这是需要为其返回所有键的映射。keys-返回值返回Map中的键列表。-module(helloLearnfk).-export([start/0]).start()->Lst1=[{"a",1},{"b",2},{"c",3}],Map1=maps:from_list(Lst1),io:f......
  • 函数
    函数1.函数的定义和调用#【一】函数定义的语法'''def函数名():执行代码的函数体return返回值'''#【1】函数的基本定义##定义一个名字叫login的函数#deflogin():##pass#...####调用定义好的函数#login()#【2】无参无返回值的......
  • mybatis-plus 新版代码生成器模板
    publicclassCodeGenerator{publicstaticvoidmain(String[]args){//数据源配置FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/xdclass?useUnicode=true&characterEncoding=utf-8&useSSL=false","root",&qu......
  • Java第四课_循环和函数
    1.循环for/*for(初始化语句A;boolean类型表达式B;更改表达式C){循环体,就是需要被重复执行的代码;D}执行顺序:for-->A-->B-->|false:循环到此结束......
  • 函数的定义和调用
    函数的定义和调用函数的使用必须遵循’先定义,后调用’的原则。函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。定义函数的语法......
  • 函数的基本使用
    什么是函数函数就相当于具备某一功能的工具使用函数必须遵循一些规则:先定义后调用为何要使用函数组织结构不清晰,可读性差代码冗余,臃肿因为代码冗余导致可维护性,扩展性差函数的定义函数是一个工具,函数名应该定义为动词,而不是名词。deffunction_name(paramete......