zoukankan      html  css  js  c++  java
  • 生成函数 学习笔记

    生成函数是什么

    就是把一个数列当作多项式的系数,比如 ({1,1,4,5,1,4}) 的普通生成函数是 (F(x)=1x^0+1x^1+4x^2+5x^3+x^4+4x^5)

    注意我们一般用 (F(x),G(x),H(x)) 来表示一个生成函数。

    不可思议的是,它还可以支持无限数列,比如 ({1,1,1,1,1,1...}) 的生成函数就是 (F(x)=1+x+x^2+x^3+x^4...),也可以写作 (Large F(x)=sumlimits_{i=0}x^i)

    然而这东西看起来很烦,我们可以这样想:

    [F(x)=1+x+x^2+x^3+x^4+x^5...\ xF(x)=x+x^2+x^3+x^4+x^5+x^6... ]

    第二个式子减去第一个式子,有:

    [xF(x)-F(x)=-1\ F(x)=frac{1}{1-x} ]

    很神奇,但很反直觉(如果 (x=2,3,4...) 之类的,这么多东西加起来是一个负数?),因为这玩意的收敛是 ((-1,1)),但是在 OI 中,一般我们不管这收敛,只需要推式子就好了。

    普通生成函数

    讲解

    形如 (sumlimits_{i=0}a_ix^i) 的生成函数叫做普通生成函数(OGF),一般求组合数

    苹果蓝17在小学一年级的时候就推出了一些常用的普通生成函数封闭形式

    常用生成函数封闭形式

    • ({1,1,1,1,1...}),为 (1+x+x^2+x^3...=Large frac{1}{1-x})
    • ({1,0,1,0,1...}),为 (1+x^2+x^4+x^6...=F(x^2)=Large frac{1}{1-x^2})
    • ({1,k个0,1,k个0...}),为 (F(x^{k+1}))
    • ({1,1,1,1})(有限数列,共 (k)(1),后面都是 (0)),为 (Largefrac{1-x^k}{1-x})
    • ({1,1,1,1}) (最高的 (1)(k) 次项),为 (Largefrac{1-x^{k+1}}{1-x})(和上面的相同,只是造福我这种懒人= =)

    上式证明

    简要证明一下,可以略过。

    对于第一个,一开始已经说过了。

    对于第二个和第三个,把 (x^2) 带入 (x) 就好。

    对于第四个:

    比如 (k=4) 的情况,就是 (F(x)=1+x+x^2+x^3)

    (xF(x)=x+x^2+x^3+x^4)

    接下来:

    [xF(x)-F(x)=x^4-1\ F(x)(x-1)=x^4-1\ F(x)=frac{x^4-1}{x-1}=frac{1-x^4}{1-x} ]

    其它的讲解也待填


    组合意义

    • 如果系数全是 (1),组合意义就是拿 (n) 个小球组合的方案数。(注意是组合,即先拿红球、后拿黄球,和先拿黄球、后拿红球是一样的方案)

    • 如果系数是 (a_i),组合意义就是每个小球有一个权值,拿一组小球的价值是所有小球权值乘积,求出所有方案数的价值之和

    指数生成函数

    讲解

    形如 (Largesumlimits_{i=0} a_ifrac{x^i}{i!}) 的生成函数叫做指数生成函数(EGF),一般求排列数,使用方式与 OGF 差不多。

    苹果蓝17在小学二年级的时候就推出了一些常用的指数生成函数封闭形式

    • ({1,1,1,1,1...}),为 (Large 1+x+frac{x^2}{2!}+frac{x^3}{3!}...=e^x)
    • ({1,0,1,0,1...}),为 (Large 1+frac{x^2}{2!}+frac{x^4}{4!}...=frac{e^x+e^{-x}}{2})
    • ({0,1,0,1,0...}),为 (Large x+frac{x^3}{3!}+frac{x^5}{5!}...=frac{e^x-e^{-x}}{2})

    非常神奇~

    苹果蓝17在小学三年级还说过,其它数列可以通过求导得到,但是我不会。

    所以比如某某题的题意是,你依次放置 (n) 个球,要求怎么样怎么样,求方案数。你推出了此题的 EGF 为:

    [5+frac{e^{7x}-e^{-7x}}{6} ]

    那么你就可以化回来,变成:

    [上式=5+sum[i为奇数]frac{(7x)^i}{i! imes 3}=5+sum[i为奇数]frac{7^ix^i}{i! imes 3} ]

    接下来求出其第 (n) 项系数,就是 (Large [n为奇数]frac{7^n}{3}),即当 (n) 为偶数的时候方案数是 (0),是奇数时方案数是 (Large frac{7^n}{3})


    组合意义

    你可能会想,这不是除了个 (i!) 吗,方案数应该更少。但显然一般来说,一个东西的排列数肯定比组合数多。但事实上你想一想,这就相当于普通的生成函数给系数 (a) 乘上了 (i!),然后给 (x) 除掉了 (i!),没有变化,但是系数变成了排列数,故。


    例题

    Chocolate (注意 UVA 上用生成函数会被卡精度,过不了)

    首先剩余的球不可能比颜色 (c) 还多,更不可能比拿出的球 (n) 还多,所以事实上, (mle 100)

    题意化为,有 (m) 个球出现奇数次,((c-m)) 个出现偶数次,求方案数(概率就是总方案数除以合法方案数)。

    很显然我们快速写写数列:

    [{0,1,0,1,0...}\ {0,1,0,1,0...}\ {0,1,0,1,0...}\ ...共 m 个\ {1,0,1,0,1...}\ {1,0,1,0,1...}\ {1,0,1,0,1...}\ ... 共 (c-m) 个 ]

    然后化成生成函数的封闭形式

    [frac{e^x-e^{-x}}{2}\ frac{e^x-e^{-x}}{2}\ ...共 m 个\ frac{e^x+e^{-x}}{2}\ frac{e^x+e^{-x}}{2}\ ...共 (c-m) 个 ]

    把它们全部乘起来,再化为一般形式,然后看看第 (m) 项系数就行了。最后要乘上一个 (Large inom{c}{m}),因为不知道每个颜色的球取偶数个还是奇数个。

    还记得二项式定理吗?(Large (a+b)^n=sumlimits_{i=0}^n inom{n}{i}a^nb^{n-i}),待会需要用到它

    开始爆化简:(抄袭参考了辰星凌大佬的题解,她将 (Large inom{c}{m}) 乘了进去)

    [egin{aligned} F(x) &=C_{c}^{m}left(frac{e^{x}-e^{-x}}{2} ight)^{m}left(frac{e^{x}+e^{-x}}{2} ight)^{c-m} \ &=frac{C_{c}^{m}}{2^{c}}left(sum_{i=0}^{m}(-1)^{i} C_{m}^{i} e^{(m-2 i) x} ight)left(sum_{j=0}^{c-m} C_{c-m}^{j} e^{(c-m-2 j) x} ight) \ &=frac{C_{c}^{m}}{2^{c}} sum_{i=0}^{m} sum_{j=0}^{c-m}(-1)^{i} C_{m}^{i} C_{c-m}^{j} e^{(c-2 i-2 j) x} \ &=frac{C_{c}^{m}}{2^{c}} sum_{i=0}^{m} sum_{j=0}^{c-m}(-1)^{i} C_{m}^{i} C_{c-m}^{j} sum_{n geqslant 0} frac{x^{n}}{n !}(c-2 i-2 j)^{n} \ &=sum_{n geqslant 0}left(frac{C_{c}^{m}}{2^{c}} sum_{i=0}^{m} sum_{j=0}^{c-m}(-1)^{i} C_{m}^{i} C_{c-m}^{j}(c-2 i-2 j)^{n} ight) frac{x^{n}}{n !} end{aligned} ]

    把那个系数拿来算就好了。

    计算组合数可以用如下方式预处理,复杂度 (O(n^2))

    rep(i,1,100)C[i][0]=C[i][i]=1;
    rep(i,1,100)rep(j,1,i-1){
    	C[i][j]=C[i-1][j]+C[i-1][j-1];
    }
    
  • 相关阅读:
    API连接显示
    zabbix基本介绍
    JMX类型监控
    zabbix sender
    监控项的获取
    zabbix值显示的问题
    windows客户端
    gj的zabbix客户端开机自启动设置
    TCP/UDP
    内置宏
  • 原文地址:https://www.cnblogs.com/BlankAo/p/14506730.html
Copyright © 2011-2022 走看看