组合数学,容斥原理与反演
Posted zhangleo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合数学,容斥原理与反演相关的知识,希望对你有一定的参考价值。
这一篇是一个专题总结,可能会写很久,希望不会咕掉
一.组合数学:
①.基本公式:
1.排列数公式$A_n^m=\\fracn!(n-m)!$,表示从$n$个元素中选出$m$个元素并进行全排列的方案数
特别的,当$m=n$时,有$A_n^n=n!$(规定$0!=1$)
2.组合数公式$C_n^m=\\fracn!m!(n-m)!$,表示从$n$个元素中选出$m$个元素的方案数
排列与组合的关系:$A_n^m=C_n^mm!$
3.组合数常见的等式:
(1).组合数的递推公式
$C_n^m=C_n-1^m-1+C_n-1^m$
基于这一等式,产生了杨辉三角:
1
1 1
1 2 1
1 3 3 1
...
杨辉三角第$i$行第$j$列表示$C_i^j$(因此下标必须从$0$开始计数)
(2).杨辉三角某一行的求和公式:
$\\sum_i=0^nC_n^i=2^n$
这一公式比较常用
(3).杨辉三角某一行的平方和公式:
$\\sum_i=0^n(C_n^i)^2=C_2n^n$
(4).组合数的奇偶求和公式:
$C_n^0+C_n^2+...=C_n^1+C_n^3+...=2^n-1$
(5).组合数求和公式:
$\\sum_i=m^nC_i^m=C_n+1^m+1$
代入上述递推式即可证明
(6).组合数的卷积公式:
$\\sum_i=0^kC_m^iC_n^k-i=C_n+m^k$
(7).组合数的对称性:
$C_n^m=C_n^n-m$
从$n$个元素中取出$m$个拿走等价于从$n$个元素中取出$n-m$个留下
②.二项式定理:
1.基本公式:
$(x+y)^n=\\sum_i=0^nC_n^ix^iy^n-i$
2.有关推论:
(1).
令$y=1$,得:
$(x+1)^n=\\sum_i=0^nC_n^ix^i$
然后对上式左右求导,得到:
$n(x+1)^n-1=\\sum_i=1^niC_n^ix^i-1$
再令$x=1$,得:
$n2^n-1=\\sum_i=1^niC_n^i$
发现右侧从$0$开始无影响,也即:
$n2^n-1=\\sum_i=0^niC_n^i$
不过更常见的是左右互化的应用。
(2).
令$y=1$,得:
$(x+1)^n=\\sum_i=0^nC_n^ix^i$
然后对上式左右积分,得:
$\\int (x+1)^n=\\int \\sum_i=0^nC_n^ix^i$
展开得:
$\\frac1n+1(x+1)^n+1=\\sum_i=0^n\\frac1i+1C_n^ix^i+1$
再令$x=1$,得:
$\\frac2^n+1n+1=\\sum_i=0^n\\fracC_n^ii+1$
仍然可以左右互化
这两个是比较常用的结论
二.序列的生成函数:
生成函数在计算方案数以及计算递推公式时都有很大的作用
①.基本定义:
给出序列$a_n$=$a_0,a_1,a_2...a_n$,构造一个函数(或者多项式)$F(x)=a_0+a_1x+a_2x^2+...+a_nx^n$,则这个函数称作这个序列的生成函数(也叫母函数)
例:序列$1,1,1....$的生成函数是$F(x)=1+x+x^2+...$
可以看到,对于一个无穷数列,其生成函数自然会有无穷项
但是我们在解决问题时显然不可能讨论一个有无穷项的函数,而且这种函数的运算是极其困难的,因此我们考虑对这种函数进行化简:
(在化简这里有两种说法,这两种说法都能得出最后的结果,因此对于我这种蒟蒻暂且认为这二者等价,如果有大佬发现问题请及时讲解,谢谢!)
1.来自大部分资料的观点:
对于一个函数$F(x)=1+x+x^2+...$,可以发现这是一个等比数列求和的形式,由于在生成函数中真正体现数列性质的是每一项前的系数,而自变量本身的取值则意义不大,大部分时候我们不需要也不应该对这个自变量进行赋值,因此我们不妨给定一个定义域$x\\in (0,1)$,这样基于无穷递缩等比数列求和公式($\\sum_i=0^∞q^i=\\frac11-q(q\\in (0,1)$)立刻可以得出该函数的一个变形:$F(x)=1+x+x^2+...=\\frac11-x$
2.来自一个ppt的观点:
对于一个多项式,给出记法$F(x)$ $mod$ $x^n$表示$F(x)$在只保留次数低于$n$的项之后剩余的部分
那么仍然套用等比数列求和公式(虽然不是递缩的不一定收敛但保证$x!=1$公式还是可以用的嘛)
可以写出:$F(x)=\\frac1-x^n1-x$
当$n->∞$时,对任意的$m$,一定有:$\\frac1-x^n1-x$ $mod$ $x^m=\\frac11-x$
因此$F(x)=1+x+x^2+...=\\frac11-x$
(这两种观点我个人认为都是在$n->∞$时令$x^n=0$基于等比数列求和给出的,因此最后导出的结果一致,至于中间理解...见仁见智吧,我个人更喜欢第一种理解方式)
无论如何,我们已经做出第一个生成函数了
可是...这玩意有啥用?
②.实际应用——计算方案
问题:
设物品$A$共有$n$种价格,每种价格$i$有$a_i$个物品
设物品$B$共有$m$种价格,每种价格$i$有$b_i$个物品
求:已知总花费$w$,在$A$,$B$两种物品中各购买一件物品,问总方案数?
(sb水题)
设物品$A$选用的价格为$i$,则与之对应的物品个数即为$a_i$,那么物品$B$选用的价格即为$w-i$,与之对应的物品个数为$b_i$,因此这一种的贡献即为$a_ib_w-i$
因此总贡献即为$\\sum_i=0^wa_ib_w-i$
(我会FFT,NTT!!!)
于是目测这个问题已经解决了
(好像没用上生成函数嘛)
但是,如果我们换个角度思考,对序列$a_n$,$b_m$分别构造生成函数$F(x)=\\sum_i=0^wa_ix^i$,$G(x)=\\sum_i=0^wb_ix^i$,那么上面的答案不就是$F(x)$与$G(x)$做卷积后$x^n$这一项前面的系数嘛!
(我不用生成函数也能看出来!)
如果我们有200个序列有各自的要求呢?
emmmmm.....
好像问题有点大...
但是,如果我们用生成函数,无论有多少个序列,最后也都是把这一坨东西乘起来就行了嘛
好像问题不大了...
可是...如果我们给出的数列有无穷项呢?
总不能跑无穷的FFT吧...
问题好像又出来了...
但是,如果仔细想想,怎么会让你做一个又没有递推(通项)又无穷的数列嘛!
这不是难为人吗
因此,如果一个数列有递推或者通项,那么生成函数可以借助上面的形式去化简啊
可是...我们最后要的是生成函数中某一项的系数,都变成这种诡异的分式怎么找最后的答案嘛!
不要忘了,上面我们做的都是等式,等式左右两侧可以互换的啊!
因此如果我们最后能求出一个分式的结果,那我们就能反向导出一个多项式!
因此我们的核心问题就在于怎么快速双向推导
我们有前辈的经验!
两个常见的模型:
$F(x)=1+x^a+x^2a+...=\\frac11-x^a$
在有限项下的特殊情况:
$F(x)=1+x^a+x^2a+...+x^na=\\frac1-x^(n+1)a1-x^a$
(注意!无限项与有限项是有本质区别的,因此有限项不应该套成无限项的公式)
另一个模型:
$F(x)=\\sum_i=0^∞C_i+k-1^k-1x^i=\\frac1(1-x)^k$
(以上内容不加证明直接给出)
下面给出一道例题:
题解看这里
③.实际应用——计算数列的通项:
当然了,生成函数还有别的用处,比如用来求个通项之类的,最典型的例子就是斐波那契数列通项的计算,通常用的是特征根法,但是生成函数是一个适用范围更广的方法
1.给出序列$f(n)=af(n-1)$($f(0)=1$),求该序列的通项
这不是等比数列么
从这里开始我觉得更好理解一些
首先直接构造这一序列的生成函数:
$G(x)=\\sum_i=0^∞f(i)x^i$
根据递推式,我们应当左右乘一个$ax$,于是得到:
$axG(x)=\\sum_i=0^∞af(i)x^i+1$
根据递推式,$af(i)=f(i+1)$,得到:
$axG(x)=\\sum_i=0^∞f(i+1)x^i+1$
上下做差,得到:
$(1-ax)G(x)=f(0)x^0=1$
移项得:
$G(x)=\\frac11-ax$
发现就是我们上面提到过的一个等比数列求和的模型(只不过公比变成了$ax$),于是立刻还原成等比数列求和的形式:
$G(x)=1+ax+(ax)^2+...$
也就是
$G(x)=1+ax+a^2x^2+a^3x^3+...$
那么$x^i$前的系数即为$a^i$,也即$f(i)=a^i$
(这玩意用生成函数求怕不是闲的)
你对生成函数的力量一无所知
2.给出序列$f(n)=f(n-1)+f(n-2)$($f(0)=0,f(1)=1$),求该序列的通项
这是斐波那契数列嘛
我会矩阵乘法!可我问的是通项
仍然按照套路来,构造一个生成函数$G(x)=\\sum_i=0^∞f(i)x^i$
那么基于递推,显然要做两次变形:
左右乘$x$,得到:
$xG(x)=\\sum_i=0^∞f(i)x^i+1$
左右乘$x^2$,得到:
$x^2G(x)=\\sum_i=0^∞f(i)x^i+2$
后两个表达式求和,得到:
$(x+x^2)G(x)=\\sum_i=0^∞f(i)x^i+1+\\sum_i=0^∞f(i)x^i+2$
也就是:
$(x+x^2)G(x)=\\sum_i=1^∞[f(i)+f(i-1)]x^i+1$
根据递推公式,可以求得:
$(x+x^2)G(x)=\\sum_i=1^∞f(i+1)x^i+1$
再用第一个表达式去减:
$(1-x-x^2)G(x)=f(1)x^1$
移项可得:
$G(x)=\\fracx1-x-x^2$
问题来了:这玩意怎么变回多项式形式?
我们只会上面那两种原式形式啊!
没有关系,我们做一个转化就好。
我们看看,能不能将上述表达式转化成$G(x)=\\fracA1-ax+\\fracB1-bx$的形式
那么首先整理一下分母,把分母写成$(1-ax)(1- bx)$这种形式
如果我令上式为0,可以求得$x_1=\\frac1a$,$x_2=\\frac1b$
那么求解分母$1-x-x^2=0$这个二次方程,解得:
$x_1=\\frac-1+\\sqrt52$,$x_2=\\frac-1-\\sqrt52$
那么对应一下,就得到了:
$a=\\frac\\sqrt5+12$,$b=\\frac-\\sqrt5+12$
于是变形得到:
$\\fracA1-\\frac1+\\sqrt52x+\\fracB1-\\frac1-\\sqrt52x$
那么再通分一下,得到:
$\\fracA[1-\\frac1-\\sqrt5 2 x]+B[1-\\frac1+\\sqrt5 2 x]1-x-x^2$
(不要担心这个式子,因为他在一秒钟之内就会消失)
与原来的生成函数对应一下,发现原来的分子是$x$,因此我们整理之后立刻可以列出一个二元一次方程组,即要求常数项为$0$,一次项系数为$1$的一个方程组
也就是:
$A+B=0$
$-\\frac1-\\sqrt52A-\\frac1+\\sqrt52B=1$
解之,得:
$A=\\frac1\\sqrt5,B=-\\frac1\\sqrt5$
那么也就是:
$G(x)=\\frac1\\sqrt5\\frac11-\\frac1+\\sqrt52x-\\frac1\\sqrt5\\frac11-\\frac1-\\sqrt52x$
那不就相当于两个等比数列乘系数相加了嘛!
于是通项也就写出来了:$f(n)=\\frac1\\sqrt5[(\\frac1+\\sqrt52)^n-(\\frac1-\\sqrt52)^n]$
这个表达式的神奇之处也在于,即使里面充满了$\\sqrt5$,你算出来的结果也一定是一个整数!
这就是生成函数的力量。
三.常见的模型结论:
①.卡特兰数问题:
模型1:给出$n$个0和$n$个1,将他们排成一个长度为$2n$的序列,问有多少种排列方式使得在该序列的任意前缀中$0$的个数不少于$1$的个数?
模型2:给出$n$对括号,问有多少种合法的括号序列(将左括号看做"0",右括号看做“1”,问题和模型1等价)?
模型3:在一个$n*n$的网格中从左下角向右上角走,只能向上或向右且不能越过对角线的方案数?
模型4:一个有$n+1$个叶节点的不同二叉树种类数?(或有$n$个节点的二叉树种类数?)
模型5:在圆上有$2n$个节点,两两连线
这些问题的答案都是卡特兰数的第$n$项
卡特兰数列记作$c_n$($c_0=1$)
他的通项:$c_n=C_2n^n-C_2n^n-1$=$\\frac1n+1C_2n^n$
他的递推:$c_n+1=\\frac2(2n+1)n+2c_n$
递推的卷积形式:$c_n+1=\\sum_i=0^nc_ic_n-i$(注意左右互化,推出右侧这种形式的东西考虑卡特兰数)
③.容斥原理:
设$|A|$表示集合$|A|$的元素个数,则有:
$|A_1\\cup A_2\\cup ...\\cup A_n|=\\sum (-1)^m-1|A_a_1\\cap A_a_2 \\cap... \\cap A_a_m|$
这是最基础的表达式,任何一种形式的反演都可以看做容斥原理作用于某一个模型下的结果
以上是关于组合数学,容斥原理与反演的主要内容,如果未能解决你的问题,请参考以下文章