• 母函数第二弹 之 真正的母函数入门


    闲话:

    上次第一期更完了之后,博主觉得题目貌似还是相对来说trl。

    于是博主觉得在这一期除了介绍母函数以外,还带来了一波富有思维量的 毒瘤题 水题。

    嗯,就这样吧。闲话不多说,现在就开讲了!

    定义:

    生成函数即母函数,是组合数学中尤其是计数方面的一个重要理论和工具。

    生成函数有普通型生成函数和指数型生成函数两种,其中普通型用的比较多。

    形式上说,普通型生成函数用于解决多重集的组合问题,而指数型母函数用于解决多重集的排列问题。

    母函数还可以解决递归数列的通项问题(例如使用母函数解决斐波那契数列的通项公式)。

    对于任意数列   

    即用如下方法与一个函数联系起来:

    则称G(x)是数列的生成函数

    (注意:数列可以是有限的也可以是无限的,母函数也一样)

    (以上两段摘自百度百科~~~)

    嗯,这就是基本定义了。

    不知各位看官们有没有理解呢?

    想必应该是没有的,博主本人在第一次看到这些定义的时候也是一脸懵逼。

    那么既然如此,就通过上一些例题帮助大家理解,

    然后博主在立足于这个定义,

    给各位一边解释例题的证明,

    一边补充讲解这些定义吧。

     

    那么,一波例题即将发车啦!

    请各位系好安全带,并确认自己已经清楚上面例题内容。

    为保证您的出行安全,如若您还有迷惑,请自行下车回看(向上翻)。

    列车即将发车。下一站,例题!

     

    例题:

    (1)使用母函数法求Fib通项。

            写在前面:

            博主首先声明,如果只是为了证明Fib数列绝对不需要什么鬼母函数。

            如果您是高中生,请您使用特征根法手撕本题。

            如果您是初中生,这个问题就有一些困难了。

            不过不要紧,如果您知道n次方差公式,您还是能够求出结论的。

            并另外给您一个传送咒语:

            传送!!!

            这是一篇介绍初中生写的纯初等的方式解决Fib通项的文章,

            不过应该还有学生习作的性质,毕竟还扯了一些闲话。

           (不过不要紧啦,反正本章随笔介绍的重点是用母函数法来做)

            好了,关于Fib问题的 闲扯 介绍就先到这里,下面将用母函数法怎么搞。

     

    解: 对于Fib数列{1, 1, 2, 3, 5, 8, 13, 21, 34,......,} 

            我们有生成函数(记不记得,又名母函数)F(x) = x + x2 + 2*x3 + 3*x4 + 5*x5 + ...... + Fib(n)*xn + ......

            (换句话说,就是构造一个函数,使得它的n次方系数与Fib(n)形成一个一 一对应关系)

            (那为啥要这样构造呢?那当然有这样做的意义。这个意义后面自然就会显现。)

            嗯,下面继续我们的求解。根据Fib的递推式 Fib(n+2) == Fib(n+1) + Fib(n),我们可知,

            F(x) + x*F(x) == F(x)/x  - 1;                ···························································· (1)式

            (这是显然的。请读者在草稿本上画上几项,就容易发现其显然性。)

            (额。。。算我没说这句话吧还是稍微讲一下当凑字。)

                           

                             对于这个子问题的解释(各位巨佬们大可考虑自行跳过):

                             首先我们看等式左边:

                             F(x) = x  +  x +  2*x +  3*x +  5*x5 +  ......  +  Fib(n)*xn  +  ......

                                +                                            +

                         x*F(x) =         x +     x +   2*x4 +  3*x5 +  ......  +  Fib(n-1)*xn + ......      

                                                                             =

                                       x + 2*x+  3*x +  5*x+  8*x5 +  ......  +  (Fib(n-1)+Fib(n))  Fib(n+1) *xn  +  ......

                                      (说过了Fib(n+2) == Fib(n+1) + Fib(n)嘛!)                        

                              然后我们再来看等式右边

                              F(x)/x = x1-1 + x2-1 +  2*x3-1 +  3*x4-1 + 5*x5-1 +  ......  +  Fib(n)*xn-1 + Fib(n+1)*xn  ......                                                  

                              减去1之后,蓝色的多余部分显然就没有了。

                              然后我们对比每一项的系数(粉色部分),是不是发现,这两个函数是完全相同的?

                                这样不就证完了么?是不是很显然。

     

            好了,然后回归证明吧。

           我们把(1)式移项变形变形,是不是就得到了F(x) = -x /(x2+x+1)

           因为分母这方程的两个根下面会频繁用,不过这个分式啊根式啊什么的写起来太复杂,

           我们这里就用 λ1 和 λ2 表示这个方程的两根吧。

           也就是说,x2+x+1 == (x-λ1)*(x-λ2)

           那么我们对变形后的(1)再进行拆分,显然有F(x) = A/(x-λ1)  +  B/(x-λ2); A,B的意义同上面的λ。

          (就是当某个式子经常要使用却又比较复杂,我们常常会设一个量来表示。这可以类似理解成OI里的define) 

           然后我们会注意到 (1-x)-1 == 1 + x + x2 + x3 + x4 + ... + xn + ... (就是这样无限的加下去)

           (这一步非常关键,也是一种经典的构造方法。就可以把分数的多项式与整数型式的来进行对应系数比较。)

           就可以容易地推出Fib的通项就是 Fib(i) = -A/λ1 * λ1-i  +  -B/λ2 * λ2-i

           然后把A, B, λ1, λ2 算出来带进去就可以得到Fib的通项了。

                         

                         下面继续讲清楚这个证明中看起来尚有模棱(leng)两可的地方。(其实已经挺清楚了诶) 

                         先说一下这个结论吧,(1-x)-1 == 1 + x + x2 + x3 + x4 + ... + xn + ...

                         很显然对吧…     好吧,如果您觉得不是很显然,没关系,换个元,令k=x-1

                         然后就是要证明 k /(k-1) == 1 + k-1 + k-2 + k-3 + k-4 + k-5 + … + k-n + ……

                         对这个式子,套个等比数列求和考虑个极限就OK了。(如不知道请出门右转百度)

                         (其实不需要换元,不过换元还是貌似更方便初学者理解)

                         嗯,这个式子就说到这里。

                         不过然后怎么样呢?(其实我承认之前写的时候因为紧着去吃饭跳了点步,不过不影响阅读吧QAQ

                         好吧,那我就继续细讲一讲通过这个式子是怎么构造变换的。

                         首先,我们有F(x) = A/(x-λ1)  +  B/(x-λ2);(上面刚刚说明了)

                         然后我们考虑把λ1和λ2提出来构造(x-1)-1(这是一种非常常用的手法)

                         式子是不是就变换成了 A/[λ1*(x*λ1-1 - 1)]  +  B/[λ2*(x*λ2-1 - 1)],

                         也就是 (-A*λ1-1) * (1 - x*λ1-1)-1  +  (-B*λ2-1) * (1 - x*λ2-1)-1

                         然后我们就会惊奇的发现:我们构造出了两个(1-x)-1 的形式!(亮亮部分)

                         (好吧,其实一点也不惊奇。感觉自己沙壁一样…

                         然后就带公式呗,再写成西格玛的形式,就显然是:

                         F(x) == (-A*λ1-1) * Σ0<=k<=+∞ (x/λ1)k + (-B*λ2-1) * Σ0<=k<=+∞ (x/λ2)k;               ···························································· (2)式

                         又由题设,我们知道:

                         F(x) == x + x2 + 2*x3 + 3*x4 + 5*x5 + ...... + Fib(n)*xn + ......

                         这样不是特别方便对比,于是写成西格玛的形式,显然就是

                         F(x) == Σ1<=k<=+∞ Fib(k) * xk;               ···························································· (3)式

                         两个函数显然是同一个函数(只是不同的变换),

                         所以它们的对应系数显然是会相等的。

                         对比xi的系数,

                         由(2)式,得出xi的系数为-A/λ1 * λ1-i  +  -B/λ2 * λ2-i

                         由(3)式,得出xi的系数为 Fib(i);

                         又因为对应系数相同,所以上述两式恒等。

                         然后呢?我们发现了什么?

                         嘿嘿嘿… 您仔细瞧一瞧看一看。

                         这不就是Fib(i)的表达了么!!!                     

                         有没有顿悟之下想砸电脑的冲动?!!

                        (巨佬请仔细越过上面几句沙壁的话)

                         现在您应该清楚了用母函数法证明Fib通项的巧妙全程吧!

                        (如仍然不清楚,好心的博主回无限给您重复(只要往上翻就行了)

            第一题的证明(这也叫做证明?你要是竞赛答案写的这么繁琐肯定爆0)就到这里了。

           下面说明一下上面刚刚提到的一个拓展到了-1的“二项式定理?”(又叫做无穷缩比数列求和公式)

           其实这个还有一个应用更广泛的拓展定理,长这样:

           (1-x)-n-1 == Σ0<=k<=+∞ C(n+k, n) * xk

           这个结论非常有用,值得(应该)牢记

           证明的话非常简单。

           由n=0的形式对等式左右两边求n阶导就行了。

           (不知道导数的出门右转百度)

           (还是别出去了,就当我没说。百度上那么简略的讲解您看得懂也是神奇了…)

           (没有关系,高中老师会讲的QAQ)

            所以,既然这里都已经讲到了负次幂的泰勒展开

           (就是这个玩意从等式左边的样子展成等式右边的样子的过程叫做泰勒展开,又名泰勒张开等。名字啦,不要太在意。)

            要不就把分数幂的泰勒展开给讲掉吧!(这俩玩意在母函数里都用得极为广泛!)

            那现在就开讲了:

           (上图片摘自百度)

            这个的证明要用到高等数学,中学对此不做要求。

            如果您有兴趣,可以买一本同济大学的微积分教材。

            应该是在第一本的第四章吧,(哎,博主trl,真的记不太清…尬……)

            反正在第二换元法的后面讲到了Euler第二积分,又名Gamma函数 。

            这里讲到了阶乘向实数域的推广,并由这些导出了一系列结论(广义二项式定理也在其中)。

            嗯,就是这样。                其实并不需要管它啦!

            数竞都不要求会证(但要求掌握…也是醉了。)

            接下来博主可能会考虑添加关于广义二项式定理构造的题目,这就更方便大家理解啦!

                

            让我们再回顾一下第一题的证明全思路。(逻辑链)

            其实如果真正想这道题应该是这样想的。

            首先,注意到Fib数列是无限的。

            所以我们要考虑一种打开后是无限项的构造。

            然后我们再注意到Fib数列的递推关系,并由此得出F(x)关于x的方程。

            后面呢其实都是关于这个方程的求解以及一系列变换,

            发现往负指数张开的路是走的通的。

            然后就这么推下去呗,

            就可以一步步推出来咯。

            所以本质上,母函数是一种算两次思想。

            第一次是我们所构造出的需要求的东西

            第二次则是先把第一次的作为条件,

            通过递推关系啊,特征啊什么的一系列题设条件搞上去,

            然后变换变换变换再变换,把它变成第二种样子的式子。

            再利用到它实际上是与第一次是同一个式子这个本质,

            就会知道它们的函数值对应相等,对应系数相等一系列锐利的性质,

            就基本上可以导出所要求的啦!

           

            所以熟练掌握母函数的其一条件就是要有极强的变换能力。

            换句话说,就是得精通代数以及组合方面的各类公式直接的转换,

            还最好要有丰厚的知识储备和灵敏的嗅觉,

            这样就能够帮助你在解题的时候能够清楚地明确方向,

            并且势如破竹地朝那个方向推进。

            所以说,朋友,如果您有兴趣,继续往下看吧QAQ!

       

            那么第一道母函数例题和相关内容就介绍到这里了。 

            这也就意味着您已经入门了。

            那么这也就意味着,接下来的内容,

            将不再以 OI- 的速度讲解了,

            开始以 OI+/数竞- 的速率讲解了。

            是不是您对母函数的了解也更清楚了呢?

            那就让我们来趁热打铁,再来一题!

    (2)使用母函数法推导第二类Stirling数的通项。

     

             首先科普一下什么是第二类Stirling数吧。

             第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数,记为
                  或者          (显然是摘自度娘的嘻嘻)

             好了,这个定义应该还是讲的蛮清楚。.

             直接上一个由定义衍生出的结论——

             第二类Stirling数满足递推关系:

             

              感性理解一下:这个结论是不是很显然?

              

     
     
     
  • 相关阅读:
    ●BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
    ●BZOJ 1396 识别子串
    ●UVA 1608 Non-boring sequences
    ●SPOJ 8222 NSUBSTR–Substrings
    ●SPOJ 7258 Lexicographical Substring Search
    ●CodeForces 429D Trick_Function
    ●BZOJ 2555 SubString
    ●洛谷P2664 树上游戏
    ●洛谷P3168 [CQOI2015]任务查询系统
    【UVA1057】Routing
  • 原文地址:https://www.cnblogs.com/charlotte-Y/p/9897340.html
Copyright © 2020-2023  润新知