生成函数是什么
就是把一个数列当作多项式的系数,比如 ({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)
然而这东西看起来很烦,我们可以这样想:
第二个式子减去第一个式子,有:
很神奇,但很反直觉(如果 (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)。
接下来:
其它的讲解也待填
组合意义
-
如果系数全是 (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 为:
那么你就可以化回来,变成:
接下来求出其第 (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)) 个出现偶数次,求方案数(概率就是总方案数除以合法方案数)。
很显然我们快速写写数列:
然后化成生成函数的封闭形式:
把它们全部乘起来,再化为一般形式,然后看看第 (m) 项系数就行了。最后要乘上一个 (Large inom{c}{m}),因为不知道每个颜色的球取偶数个还是奇数个。
!还记得二项式定理吗?(Large (a+b)^n=sumlimits_{i=0}^n inom{n}{i}a^nb^{n-i}),待会需要用到它
开始爆化简:(抄袭参考了辰星凌大佬的题解,她将 (Large inom{c}{m}) 乘了进去)
把那个系数拿来算就好了。
! 计算组合数可以用如下方式预处理,复杂度 (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];
}