• 普通母函数简单使用


    母函数又名生成函数

    是一种重要的数论函数

    多用于求解组合数问题、递推问题

    母函数包括很多种

    例如

    普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数

    而普通母函数

    的理解则是

    把组合问题的加法法则和幂级数的的乘幂的相加对应起来

    总之母函数的思想就是

    把离散数列和幂级数一一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系

    最后由幂级数形式来确定离散数列的构造

    从经典的例子开始

    题目:有1克、2克、3克、4克的砝码各一 枚,能称出哪几种重量?每种重量各有几种可能方案?

    若是使用穷举法

    那么原题的复杂度可以达到O(n^4)

    当砝码数量达到了m个时

    原题的复杂度就成了O(n^m)

    若我们使用母函数

    复杂度则可以降到O(n^3)

    穷举的细节简单模拟一下

    1 先假设使用一个1g的砝码,然后再假设在此情况下,使用2g的砝码,在此基础上,
    2 再假设使用一个3g的,再假设使用一个4g的,这就是1中情况,
    3 显然,这种方案称出的重量为10g,然后改变上面的一个假设条件,
    4 比如假设没有使用4g的,只是用了1g、2g、3g,显然这种方案称出的是6g,
    5 以此类推,将所有的可能列举出来后即可得到全部的方案,1g的砝码有两种情况,
    6 使用还是不使用,其他的砝码也一样,每一种1g砝码的状态都可以有两种砝码状态,
    7 以此类推总共就有2*2*2*2=16中方案,当然其中包含一种一个砝码也没有的0g方案。

    最后穷尽结果为

    1g、2g、8g、9g、10g各有一种方案

    3g、4g、5g、6g、7g各有两种

    总共十五种

    嗯……

    我接下来这段也不知道该怎么讲

    所以引用一下别人的

    我们可以用一个类似离散数学的逻辑式表示前两种砝码组合出来的情况
    我在这里使用||表示析取,也就是编程时的“逻辑或”;
    用&&表示合取,也就是编程时的“逻辑与”,析取与合取都是离散数学中的概念,其实就等于编程语言中的逻辑与和逻辑或,析取与合取的符号ˆ和ˇ很多人虽学过并不熟悉,我就用编程语言中的符号代替了,熟悉离散数学的人可以转换成析取与合取的符号。
     
    (使用1g || 不使用1g)&&(使用2g || 不使用2g)
    =使用1g&&使用2g || 不使用1g&&使用2g || 使用1g&&不使用2g || 不使用1g&&不使用2g
     
    每个用 “||”分开的一项都是一种方案。“&&”表示选择第一项的情况下有选择了第二项。
    大家可以发现这个表达式和一种表达式很像,没错,如果把“||”看成加法,“&&”看成乘法,和多项式的乘法一模一样。
    那么我们直觉的想到,有没有可能用多项式乘法来表示组合的情况呢?我们再来看题目,题目需要的是几种砝码组合后的重量,是一个加法关系,
    但是在上式中“&&”是一种类似于乘法的运算关系,这怎么办呢?有没有什么这样一种运算关系,以乘法的形式运算,但是结果表现出类似于加法的关系呢?
    正好有一个,那就是幂运算。Xm 乘上Xn结果是Xm+n,他完美的符合了我们的要求。
    那么以次数表示砝码的质量, 就可以以多项式的形式表示砝码组合的所有方案。
     
    还是以前两个砝码为例说明,表示1g砝码的两种状态的多项式就是(x0+x1),表示2g的就是(x0+x2),x0表示没有使用砝码,所以重量为0,
    当然了因为x0 =1,所以也可以写成1,后面为了方便我会这么写。
    注意,砝码的质量是以次数表示的,而不是直觉上的用下标表示为x1,x2。
    这点很重要,不然的话就无法表现出幂运算的关系了。
     
    (x0+x1)*(x0+x2)
    =x0*x0 + x1*x0 + x0*x2 + x1*x2
    =x0 + x1 + x2 + x3
     
     
    很显然
    我们可以用4个砝码来递推
     

    (x0+x1)* (x0+x2) * (x0+x3)* (x0+x4)

    =x0 + x1 + x2 + 2x3 + 2x4 + 2x5 + 2x6 + 2x7 + x8+ x9 + x10 

    和我们的结果一样

    如果将每砝码数量换成无限的

    那么

    之前的式子大概可以写成

    (x0 +x1 + x2 + x3 + x4 + x5 + …… )*(x0 + x2 + x4 + x6 + x8+ x10 + ……)

    第一个多项式

    表示1g砝码每种数目都只有一种方案来组成

    同理第二者用来表明

    2的倍数的砝码只有一种方案来表示

    多项式乘法不多bb,O(n^2)复杂度,再叠加一个循环

    达到O(n^3)

    足够优化了吧

    这种复杂度遇到正常一点的题

    直接就当场裂开

    所以你还需要学

    其他的东西来辅助 谁辅助谁呀

    欸比如你需要

    FFT来优化多项式乘法

    于是复杂度到了O(nm log m)

    就这?还是不行

    所以必要时需要

    另辟蹊径把所有生成函数取ln

    然后exp

    所以为了这两个辅助品

    你还需要学

    有关复数的一些性质

    单位根的性质

    多项式卷积

    这还仅是FFT

    exp这个就直接裂开

    我根本不会,只是在一篇题解上见到过

    -end-

  • 相关阅读:
    解决在PDF文档中复制代码报错问题
    JAVA高级复习泛型
    SpringBoot高级监听原理
    SpringBoot整合其它框架整合Junit
    SpringBoot高级监控
    JAVA基础复习异常处理
    SpringBoot 整合 webservice 示例
    关于ScrollView的子View无法布满屏幕的问题
    Android开发中头疼的R文件问题
    博客园美化[SimpleMemory主题+tctip插件]
  • 原文地址:https://www.cnblogs.com/-Iris-/p/12944101.html
Copyright © 2020-2023  润新知