zoukankan      html  css  js  c++  java
  • 母函数(生成函数)

    介绍

    母函数是组合数学中相当重要的一个知识点,可以用来解决一些排列组合问题,还有所有的常系数线性齐次递推问题。如果系数不是常数,需要根据具体情况进行处理。

    具体的内容可以看组合数学相关书籍或者大佬的博客大佬的另一篇博客

    由于大佬总是想当然地把别人当成大佬,一些内容对(像我这种)蒟蒻来说不是很友好,在这里讲一下母函数的基础。(研究母函数时,钦定(|x|<1)),这样,由等比数列求和公式有:

    (frac{1}{1-x}=sum_{i=0}^infty x^i=1+x+...+x^{infty})

    (frac{1}{1-kx}=sum_{i=0}^infty k^ix^i=1+kx+...+k^{infty}x^{infty})

    1.普通型母函数。

    假设有一个数列(a),那么它的母函数其实就是一个关于(x)的多项式,(x^n)的系数为(a_n),对于已知通项的数列,其母函数可以直接写出来。

    而对于未知的数列,主要分为两类:递推型和组合型。

    递推型就是利用错位相消,举个栗子:

    (a_n=3a_{n-1}+10a_{n-2}),(a_0=1,a_1=2)

    移项,得(a_n-3a_{n-1}-10a_{n-2}=0),设(a_n)的母函数为(G(x))

    (quadquad G(x)=a_0+a_1x+quadquad a_2x^2+quadquad a_3x^3...)
    (-3xG(x)=quad -3a_0x+(-3)a_1x^2+(-3)a_2x^3...)
    (-10x^2G(x)=quadquadquadquad -10a_0x^2+(-10)a_1x^3)

    三行相加,可以发现等式右侧除了第一行的第1,2项和第二行的第1项外全消掉了。

    所以我们可以得到((1-3x-10x^2)G(x)=a_0+a_1x-3a_0x=1-x),即(G(x)=frac{1-x}{1-3x-10x^2}),生成函数就求出来了,那如果我们还要求(a_n)的通项呢?

    对于这种东西,我们可以把他化成(frac{k1}{x-A}+frac{k2}{x-B})这种形式,其中(A)(B)由分母的因式分解唯一确定,然后(k1,k2)可由待定系数法解得。

    然后对于(frac{k}{x-A}),总可以化成(k'*frac{1}{1-Nx}),就是(k'sum_{i=0}^infty N^ix^i),找出(x^k)的系数就是(a_n),如果母函数拆开成多个该类分式的话各部分相加就好。

    具体计算就不算了。

    PS:一部分非齐次线性递推其实也可以这样解,比如(a_n-3a_{n-1}-10a_{n-2}=f(n)),按照上述方法错项后会剩下一个等比数列和前几项余项。一般的,只要f(n)有求和公式,都可以用母函数求解。

    组合型就是利用组合意义构造多项式,举个栗子:

    假设现在有(a_1)个红球,(a_2)个黄球,(a_3)个白球,(a_4)个黑球,从中取(k)个球,这(k)个球的颜色组合有多少种?

    那么可以构造函数

    [G(x)=(1+x+x^2+...+x^{a_1})(1+x+x^2+...+x^{a_2})(1+x+x^2+...+x^{a_3})(1+x+x^2+...+x^{a_4}) ]

    做乘法时,如果我在第一个括号中选了(x^i)这一项,代表我选了(i)个红球,后面的括号也是一样。

    最终乘积中(x^k)的系数就是选(k)个球的颜色情况种数。

    如果选择有限制呢?比如说,现在不能没有红球,黄球只能是偶数个,白球 (geq) 3个。

    那么

    [G(x)=(x+x^2+...+x^{a_1})(1+x^2+x^4+...+x^{lfloorfrac{a_2}{2} floor *2})(x^3+...+x^{a_3})(1+x+x^2+...+x^{a_4}) ]

    其他

    有一个重要结论,如果数列(a_n)的母函数是(G_1(x)),那么(S_n=sum_{i=0}^{n}a_i)的母函数为(G_2(x)=G_1(x)*frac{1}{1-x})。(可以手动验证)

    2.指数型母函数

    指数型母函数用于解决可重集的k排列问题。

    假设现在有(a_1)个红球,(a_2)个黄球,(a_3)个白球,(a_4)个黑球,从中取(k)个球,这(k)个球的颜色排列有多少种?

    是不是可以根据上面的结论,先组合,再乘上(k!)呢?不好意思,由于选出的(k)个元素可能有重复,而且每次重复的方式不一样,不能通过先组合再排列的方式解决。

    由于可重集的排列我们是知道的,对于每一类相同的元素(假设有(n_i)个),就除以(n_i!),所以我们不妨在选一种颜色时就考虑这个因素,构造:

    [G(x)=(1+frac{x}{1!}+frac{x^2}{2!}+...+frac{x^{a_1}}{a_1!})(...)(...)(...) ]

    这样乘开后(x^k)的系数就是答案。

    假设有一个数列(a_n),令

    [G_e(x)=a_0+frac{a_1}{1!}x+frac{a_2}{2!}x^2+frac{a_3}{3!}x^3+... ]

    (G_e(x))称为(a_n)的指数型母函数,用的比较多的是(a_nequiv 1)的形式。

    为什么叫指数型母函数呢?由泰勒展开得:(e^x=1+frac{x}{1!}+frac{x^2}{2!}+...),就是上面我们所构造的形式。

    例题:(n)个不同的小球放入(m)个不同的盒子,盒子不能为空,有几种方法?

    以盒子为研究对象,此问题相当于将m个不同的元素取n个作可重复排列,每个元素不能不取,则其生成函数为

    [G(x)=(x+frac{x^2}{2!}+frac{x^3}{3!}+...)^n=(e^x-1)=sum_{k=0}^{n} binom{n}{k}(e^x)^{n-k}(-1)^k=sum_{k=0}^{n}[ binom{n}{k}sum_{m=0}^{infty}frac{(n-k)^m}{m!}x^m](-1)^k ]

    [=sum_{m=0}^{infty}[sum_{k=0}^{n}(-1)^k binom{n}{k}(n-k)^m]frac{x^m}{m!} ]

    所以n个球放到m个盒子中的方案数为(sum_{k=0}^{n}(-1)^k binom{n}{k}(n-k)^m)

    如果盒子相同呢?打乱盒子顺序,除以(m!)就行,方案数为(frac{1}{m!}sum_{k=0}^{n}(-1)^k binom{n}{k}(n-k)^m)。是不是很熟悉?对,这个东西就是第二类斯特林数的通项!

    这样,我们没有用容斥原理就求出了第二类斯特林数的通项。

    总结

    母函数的用途十分广泛,套路也很多,它甚至可以求卡特兰数通项!(但由于我太菜了没怎么看懂,所以咕了)。做题的时候要注意审题,分清是用普通型还是指数型,接下去的构造就比较容易了。

  • 相关阅读:
    Java基本语法(一)
    JAVA菜鸟入门HelloWorld
    python 练习题-质数
    python 字符串转运算符
    python 提取不重复的整数
    python 句子逆序
    python 数字颠倒
    python 字符个数统计
    python 练习题-计算字符个数
    python int型正整数在内存中存储为1的个数
  • 原文地址:https://www.cnblogs.com/landmine-sweeper/p/14004673.html
Copyright © 2011-2022 走看看