生成函数(母函数)的简单应用

同步个人博客 http://sxysxy.org/blogs/15 到csdn

Simple

一个简单的问题,给定一个数k,从集合A中选一个数a,集合B中选一个数b,使得a+b = k的方案数有多少?

扫描A的所有元素a然后在B里面找k-a --> 哈希/平衡树/stl大fa好!!!

3个集合A,B,C呢?n个集合呢?复杂度蹭蹭蹭地就不知道高到哪里去了。(假设每个集合里面的数约为k个,可以试着计算n个集合时这样暴力法做的复杂度)

生成函数

这是一类组合计数问题。

对于上面那个例子,例如k = 2 , A = {1, 2}, B = {0, 1} 人工计算也能得出有2种方案(k = a+b = 2+0 = 1+1 两种方案)

现在用生成函数来计算。定义A(x) = x^1 + x^2 = x^2 + x, B(x) = x^0 + x^1 = x+1,则令C(x) = A(x) × B(x) = x^3+x^2+x^2+x = x^3 + 2x^2 + x

C(x)为函数(其实这里也是多项式)A(x) 与B(x)的乘积,C(x)的2次项系数为恰为2,就表示从集合A中选出a从集合B中选出b使得a+b=2的方案数。同时,3次项系数为1就是a+b=3的方案数为1,1次项系数为1意味着是a+b=1的方案数为1。不存在的m次项(即系数为0)则表示不存在方案使得a+b=m。

再例如A = {x | x∈N 且x是5的倍数},B = {2, 3, 4}, C = {0, 4, 5}从中分别取出数a,b,c

那么要计算任意a+b+c = m的方案数,就是看 (1+x^5+x^10+……)(x^2+x^3+x^4)(1+x^4+x^5)最后结果m次项前的系数即可。将组合计数问题转化为乘法问题

一点微小的优化

为什么前面强调他们的生成函数是个多项式?(PS:注意并不是所有的都是多项式)~,因为多项式乘法可以FFT加速啊,这样复杂度又降低了,出题人又可以增大数据范围了,真(毒)是妙(瘤)啊!

一道练习生成函数的好题 http://syzoj.com/problem/188

你可能感兴趣的:(算法)