组合数学
1.母函数
母函数(生成函数):
生成函数有普通型生成函数和指数型生成函数两种(本题是普通型)。
形式上,普通型母函数用于解决多重集的组合问题,
指数型母函数用于解决多重集的排列问题。
母函数还可以解决递归数列的通项问题(例如使用母函数解决斐波那契数列,Catalan数的通项公式)。
1.普通母函数: /*hdu2082*/
构造母函数G(x), G(x) = a0 + a1*x + a2* + a3* +....+ an*, 则称G(x)是数列a0,a1…an的母函数。
通常普通母函数用来解多重集的组合问题,其思想就是构造一个函数来解决问题,一般过程如下:
1.建立模型:物品n种,每种数量分别为k1,k2,..kn个,每种物品又有一个属性值p1,p2,…pn,(如本题的字母价值),
求属性值和为m的物品组合方法数。(若数量ki无穷 也成立,即对应下面式子中第ki项的指数一直到无穷)
2.构造母函数:G(x)=(1++…)(1+++…)…(1+++…) (一)
=a0 + a1*x + a2* + a3* +....+ akk* (设kk=k1·p1+k2·p2+…kn·pn) (二)
G(x)含义: ak 为属性值和为k的组合方法数。
母函数利用的思想:
1.把组合问题的加法法则和幂级数的乘幂对应起来。
2.把离散数列和幂级数对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来
确定离散数列的构造。
代码实现:
求G(x)时一项一项累乘。先令G=1=(1+0*x+0*+…0*),再令G=G*(1++…)得到形式(二)的式子…最后令G=G*(1+++…)。
2.指数型母函数 /*hdu1521*/
指数型母函数:(用来求解多重集的排列问题)
n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列。
若其中某一元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的排列数应为 ,即其重复度为ni!
同理a1重复了n1次,a2重复了n2次,····,ak重复了nk次,n1+n2+····+nk=n。
对于这样的n个元素进行全排列,可得不同排列的个数实际上是 /*hdu5651*/
若只对其中的r个元素进行排列呢,那就用到了指数型母函数。
构造母函数G(x)=+则称G(x)是数列a0,a1…an的指数型母函数。
一般过程:
1.建立模型:物品n种,每种数量分别为k1,k2,..kn个,求从中选出m个物品的排列方法数。
2.构造母函数:G(x)=(1+ + …+)(1+ ++…)…(1+ ++…)
=a0+a1·x+ · + · +… · (其中pp=k1+k2+k3…kn)
G(x)含义:ai为选出i个物品的排列方法数。
若题中有限定条件,只要把第i项出现的列在第i项的式中,未出现的不用列入式中。
如:物品i出现的次数为非0偶数,则原式改为…*( + + )*…
2.Catalan数
卡特兰数(Catalan):前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670…
令h(0)=1,h(1)=1,catalan数满足递推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
另类递推式:
递推关系的解为:
递推关系的另类解为:
对于在2n位的2进制中,有n个0,其余为1,且1的累计数>=0的累计数,二进制数有种
对于在n位的2进制中,有m个0,其余为1的catalan数为:
理解:catalan数的理解
应用:
1.出栈次序: 一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列? h(n)种。 /*hdu1032*/
2.给定节点组成二叉树:给定n个节点,能构成多少种不同的二叉树? h(n)种。
3.括号化:矩阵连乘,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,有几种括号化的方案? h(n-1)种。
4.凸多边形三角划分:在一个凸n边形中,通过若干条互不相交的对角线,有多少种方法把这个多边形划分成若干个三角形? h(n-2)种。
3.容斥定理
容斥原理:(容许) 先不考虑重叠的情况,把包含于某条件中的所有对象的数目先计算出来,(排斥)然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复。
公式: 奇加偶减
一般求互质个数若用欧拉函数不好解决,则从反面考虑,用容斥。