[学习笔记]组合数学入门1-组合数/组合恒等式/卡特兰数

组合数学

组合数

多重组合数(其实指的是多重集的排列数(nn1,n2,,nk)=n!n1!nk!,其中保证的是ni=n,多项式展开的第K项系数即为n1+nk=K(Kn1,,nk),平常的二项式系数也就对应着二重集的情况。

多重集的组合数就会比较复杂,前面只是nk种元素排一排,现在我们是选出r个来排,如果r比所有的ni都小的话,那每种的物品都随便选,相当于kxi=r有多少非负整数解,那就是隔板法(r+k1k1)

接着,对于r某些个ni的情况来说,考虑Si为满足某个xini集合:

|i=1kSi|=|U||i=1kSi|

|i=1kSi|=i|Si|i,j|SiSj|+i,j,k|SiSjSk|+(1)k1|i=1kSi|=i(k+rni2k1)i,j(k+rninj3k1)+i,j,k(k+rninjnk4k1)+(1)k1(k+ri=1knik1k1)

不相邻排列

1,2,,nk个,任意两个不相邻的方案数:倒着想,考虑往nk个球的nk+1个空里面塞k个球,最后给它们标上号,方案就是我们要的(nk+1k)

另一种是考虑一个符合条件的序列对应着排完序之后,任意两个相邻元素相差至少为2,考虑其差分序列有多少种可能,进一步考虑这样的序列:b1=1,b3,b5,b7,b2k1=2,然后在b2,b4,,b2k一共k个位置填上0到n的数字,[1,2k]的前缀和就对应着一个ak,这个序列之和要不超过n。进一步变成再在最后一个位置加一个空,这里塞0到n的数字使得这么多数字之和恰好是n。于是变成k+1[0,n]的数之和要凑成n2k+1,那就经典隔板法,答案((n2k+1)+(k+1)1(k+1)1)=(nk+1k).

错排

n个的答案为D(n),假设第n+1个信箱还是放第n+1封信,对于n+1的情况考虑两种转移:①前n个信封全都装错。②前n个信封有且仅有一个信封没错,除此之外不会有别的可能能够一步转移D(n),第一种的方案数是nD(n)(前n个和n+1换都能得到一个新的错排)。第二种情况则是选择那个“没错的”信封,和它交换,而这个没错的位置也有n种,方案数nD(n1)

于是D(n+1)=n(D(n)+D(n1))

圆排列

n个人选r个人出来,围一圈的排列数,无非就是破环成链Qnr=n!r(nr)!,如果n2并且不考虑顺逆时针的话,方案数再除个2.

组合数恒等式

首先是(nk)=nkk!n可以是任意实数,然后k一般认为是非负整数,如果k<0整个定义为0.

根据定义给出的对称恒等式:(nk)=nk(n1k1).

进一步可以得到类似于(nk)=(nnk)=nnk(n1k)(nk)(nk)=n(n1k)当然这用定义也很好推)

接着比较有用的是一些求和式子,比如(nk)=(n1k)+(n1k1),对这个式子不断展开:

一种是每次把k1那个二项式系数展开,这会得到k=0n(r+kk)=(r+n+1n)

另一种是每次把k的拿一个二项式系数展开,这样最后得到的是一串下指标一样的东西:

k=0n(km)=(n+1m+1),对应着组合意义:右边是从n+1个数里选m+1个出来,左边是枚举最大值为k+1的情况下的方案数。

对于上指标是负数的情况一般有如下转化:(nk)=n(n1)(nk+1)=(1)k(n)(n+1)(n+k1)=(1)k(n+k1)k=(1)k(n+k1k)

也就是C(n,k)化成C(n+k1,k)相关的式子,一般叫上指标反转(加了个负号嘛),遇到(1)k这种形式的时候经常可以用得上:(1)k(nk)=(n+k1k)

比如我们算k=0m(nk)(1)k=k=0m(n+k1k)=(n+mm),最后一步利用了之前的求和式子,当然这个还能进一步化成(n+mm)=(1)m(n1m)

卡特兰数

非常经典的东西,比如2n个括号的括号序列合法的方案数,n个元素合法的出入栈方案数,从(0,0)走到(n,n)始终保持xy的方案数,+1和-1组成的序列中所有前缀和非负,并且总和为0的方案数…

他们的方案数都是Hn=(2nn)n+1=(2nn)(2nn1)

Hn={i=1nHi1Hnin2,nN+ 1n=0,1

也经常写成Hn+1=i=0nHiHni=H0Hn++HnH0

当然也有递推式:Hn=Hn1(4n2)n+1

前几项

H0 H1 H2 H3 H4 H5 H6
1 1 2 5 14 42 132

关于证明,一种说明的方法是考虑所有+1,-1组成的,并且和为0的序列,考虑每个不合法的集合跟另一个集合的映射关系:像是+1,-1,-1,+1,-1,+1,找到他第一个前缀小于0的位置2k+1,这意味着[1,2k+1]内有k+1个-1,以及k个+1,同时[2k+2,n]内有nk个+1和nk1个-1,然后把[1,2k+1]这一段序列取反,新的序列有k+1+nk=n+1个+1,以及k+nk1=n1个-1。

接着不难证明,任何一个非法序列都对应着一个由n+1+1n11组成的序列。

于是Hn=(2nn)(2nn1)

模型

n+1个叶节点的满二叉树

首先不难证明,n+1个叶节点的满二叉树,边一共有2n条,我们考虑任意一颗这样的二叉树从树根开始dfs,并且先左后右,同时对应一个序列,往左的时候+1,往右的时候-1。因为是满二叉树,所以一定是前缀和非负,且总和为0。

同时每个这样的序列也对应这样的树。

n+1个叶节点的满二叉树的个数为Hn

栈/+1,-1交替序列/合法括号序列/单调网格路径:

n个元素合法的出入栈序列,任意前缀和非负且总和为0的+1,-1序列,n对括号的合法括号序列,n×n的网格,从(1,1)(n,n)的所有路径里,所有点都位于或高于主对角线的路径。

方案数都是卡特兰数Hn

带标号的凸多边形,三角形分割的方案数f2=f3=1,f4=2,对于更一般地情况,考虑先按顺序给顶点编号成1n,考虑选择多边形上的任意一条边VkVk+1,它一定会被分割成为某个三角形的一条边,那我们考虑这个三角形的另一个点可以是所有剩余的n2个点,同时这一刀下去就把n边形分成了一个三角形,以及两个凸多边形。

于是给出递推式fn=f2fn1+f3fn2++fn1f2=i=2n1fifni+1

然后取gn2=fn,则fn=gn2=g0gn3+gn3g0,又g0=g1=f2=f3=1,这就是卡特兰数fn=gn2=Hn2

圆上2n个有序的点,n条线连接所有点对,使得线两两不相交的方案数:

(另一个有意思的场景是说,2n个人围一桌,有多少种可以让每个人同时和别人握手)

类似上面多边形三角分割的方案数,随便拿一个点出来考虑它和谁握手,然后把剩下2n2个点分割成两个部分,而且每个部分必须是偶数个点,于是记Hn是规模为2n的问题,Hn=H0Hn1+H1Hn2++Hn1H0

生成函数

f(z)=H0+H1z+H2z2+

能用递推式推出通项,懒得写了。

posted @   yoshinow2001  阅读(695)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示