【学习笔记】组合数学

基础定义、式子之类的

排列:Anm 表示在 n 个人中选 m 个人,顺序对答案有影响(即 1234542351 算作不同)。Anm=n!(nm)!,意义就是第一个可以有 n 种选择,第二个有 n1 种选择,一直到第 m 个有 nm+1 个选择。撑起来就是上面那个式子。特殊的有 Ann=n!

组合:Cnm 或者 (nm) 表示在 n 个人中选 m 个人,顺序对答案无影响(即 1234521543 算作相同)。组合的计算方法有很多,比较常见的是递推和算阶乘。

递推式是 Cnm=Cn1m1+Cn1m,就是说多加的那个人可能是新加的那个人,也可能是原来的序列中再挑了一个人。

阶乘算法是 Cnm=n!m!(nm)!。发现就是相对于 Anm 多乘上一个 1m!。也就是说对于选择的 m 个人相同的情况在排列中会算 Amm 中算了 m! 次,但是在组合中只会被算 1 次,所以乘上一个 1m! 就好了。有 (nm)=(nnm)

吸收公式:(rk)=rk×(r1k1),把组合数代进去很容易看出来。

吸收指标:(nm)(mk)=(nk)(nkmk)。把阶乘代进左边得到 n!k!(nm)!(mk)!,分子分母同时乘 (nk)! 然后就得到右边。

上指标求和:i=0n(im)=(n+1m+1)。理解为在 n+1 个数中选 m+1 个数的子集个数。枚举最后一个数选择第 i 个,(n+1m+1)=i=1n+1(i1m)=i=0n(im)

平行求和:i=0n(m+ii)=(m+n+1n)。这个不会证。

和斐波那契数列有关的:i=0n(nii)=Fn+1,其中 Fi 为斐波那契数列的第 i 项。不会证。

不知名式子:i=0ni2(ni)=n(n+1)2n2

证明:

  • 考虑组合推理形式。如果在 n 个人中枚举选 i 个人,给两个人打上标记(可以是同一个),方案数是 i=0ni2(ni)
  • 考虑根据被标记的人重新计算。如果标记同一个人,方案数为 n2n1
  • 如果标记两个人,方案数为 n(n1)2n2。加上之后得到 2n2(2n+n2n)=n(n+1)2n2

范德蒙徳卷积:i=0k(ni)(mki)=(n+mk)。考虑组合意义证明。在大小为 n+m 的集合中选择出 k 个数,相当于把集合拆成 nm 两个部分,在 n 中选 i 个,然后在 m 中选剩下的 ki 个。

二项式定理:

定理本身是这个:(x+y)n=i=0n(ni)xiyni

证明:

  • 对于 n=1 显然成立。考虑使用归纳法。假设对于 n=k 成立,令现在 n=k+1
  • (x+y)k+1=x(x+y)k+y(x+y)k,代入得 xi=0k(ki)xiyni+yj=0k(kj)xjynj
  • 乘进去得到 i=0k(ki)xi+1yki+j=0k(kj)xjykj+1。为了合并让指数相同,令 i=j1,为了避免出现负数提出 j=0 项。
  • yk+1+j=1k+1(kj1)xjykj+1+j=1k(kj)xjykj+1。发现很像了,把 j=k+1 提出来。
  • yk+1+xk+1+j=1kxjykj+1((kj1)+(kj))。根据递推式可以把后面的那一坨换成 (k+1j)yk+1=(k+10)x0yk0+1,xk+1=(k+1k+1)xk+1ykk1+1
  • 把两个零散的代回去就会得到二项式定理的式子。

根据二项式定理可以得到很多有用的东西。

二项式定理中取 x=y=1 可以得到 i=0n(ni)=2n,取 x=1,y=1 可以得到 i=0n(1)i(ni)=[n=0]

i=0ni(ni)=n2n1

证明:

  • S=i=0ni(ni)。则 S 同时等于 i=0n(ni)(ni)
  • 所以 2S=i=0nn(ni)=n2n。除以二即得证。

模质数 p 意义下的的类似二项式定理的东西:(x+y)pxp+yp(modp)

证明:

  • 把组合数拆开,(pi)=p!i!(pi)!。发现分子是 p!,如果不被约掉的话就会使这一项变成 0
  • 因为 p 是质数,所以只有在 i=0 或者 i=p 时分母会出现 p!。所以只需要考虑 i=0i=p 时取值。就会得到 xp+yp

二项式反演:若已知 f,则显然有 gn=i=0n(ni)fi。若已知 g 需要求 f,则 fn=i=0n(ni)(1)nigi。这个就是二项式反演。不是很懂,遇见表达有问题会回来改。

证明:

  • gi 展开,得到反演式为 fn=i=0n(ni)(1)nij=0i(ij)fj=i=0nj=0i(ni)(ij)(1)nifj
  • 改变一下枚举顺序:fn=j=0nfji=jn(ni)(ij)(1)ni。吸收指标得 fn=j=0n(nj)fji=jn(1)ni(njij)
  • k=ij,反演式进一步表达为 fn=j=0nfjk=0nj(njk)(1)njk。在二项式定理中取 x=1,y=1 就会得到形如后面这一坨的式子,根据上面的内容我们证明了这个式子的值是 [n=0],本处为 [nj=0][n=j]
  • 所以反演式简化为 fn=j=0n[n=j]fj。只有在 nj 的时候才有取值,所以成立。

同时有一种转化,若 gn=i=0n(1)i(ni)fi,则 fn=i=0n(1)i(ni)gi,这个的证明是相似的。

插板法

常用的组合数学技巧。诸如此类其实有一个叫小球盒子问题,这篇日报有很详细的讲法

经典问题:给定 n 个相同的球,分成相同的 m 组,每组不能空,方案数为 (n1m1)

考虑分组即为在一些球的空隙间插板子,用 m1 个板子隔开出 m 组。一共有 n1 个空位,所以答案就是 (n1m1)

经典问题:给定 n 个相同的球,分成相同的 m 组,每组可以空,方案数为 (n+m1n)

考虑现在多了 m 个球,然后题目条件变为每组不能空,方案数为 (n+m1m1)=(n+m1n)。可以认为我们对每组都加一个球,然后把这些球都拿走,发现是一一对应的,所以和上一个问题的解法相同。

经典问题:给定 n 个相同的球,分成不同 m 组,第 i 组至少要有 ai 个球,方案数为 (na+m1na)

显然,类比上面的,考虑把每个组的 ai 个球减去,问题变成给 na 个球分成相同 m 组每组可以空的方案数,按第二个算就好。

不相邻的排列:在 1nm 个数,这 m 个数互不相邻的组合有 (nm+1m) 种。可以假设选一个用了两个数,当前选择的数并且这个数后面那个不能选,那么就等于在 nm+1 个数(选择 n 不需要占用两个)中随便选 m 个数的方案数。

第二类斯特林数(斯特林子集数)

记作 {nm}S(n,m) 。表示将 n 个不同的球分进相同的 m 个盒子,盒子不允许空的方案数。递推式是 S(n,m)=S(n1,m1)+m×S(n1,m)。边界是 S(0,0)=1。证明显然,考虑增加一个新球时有两种可能,新开一个,是 S(n1,m1);或者放进原来一个盒子,是 S(n1,m),每个盒子都有可能,再乘上 m

通项公式:S(n,m)=i=0m(1)miini!(mi)!

证明:

  • 使用容斥原理。设将 n 个不同的球分到 i 个不同的盒子,盒子能空的方案数记为 gin 个不同的球分到 i 个不同的盒子,盒子不能空的方案数记为 fi。显然对于 gifi,有 gi=in=j=0i(ij)fj。发现这个东西就是一个二项式反演。
  • fi=j=0n(ij)(1)ijgj=j=0n(ij)(1)ijjn=j=0ni!(1)ijjnj!(ij)!
  • 考虑 fiSn,i 的关系,发现问题里不同的在于第二类斯特林数的盒子是相同的,所以就是一个类似排列和组合的区别,乘以 1i! 就好。
  • S(n,m)=fmm!。代进去就是上面那个通项公式。

所以根据这个推出来的还有一个重要公式是 xn=i=0xi!(xi)S(n,i)=i=0xS(n,i)x!(xi)!

卡特兰数

没有一个确定的定义,记作 Catalani,这一板块会简记为 Ci,这里给一个在数据规模为 n 的情况下答案是 Cn 的问题作为其定义。

记住 C0=C1=1,C2=2,很多时候边界需要自己处理。

问有多少长度为 2n 的合法括号序列。答案是卡特兰数 Cn。请在一张草稿纸上画一个平面直角坐标系,这里只需要用到第一象限。

问题能够转化为给定一个平面直角坐标系左括号是往上走,右括号是往右走,问从原点走到 (n,n) 且不碰到 y=x+1 的路径数。

没有限制很好做,答案是 (2nn),即在 2n 步中选择 n 个往上。考虑限制的条件。我们考虑对于一个经过了 y=x+1 的路径,以 y=x+1 为轴翻转。此时这条路径终点变为 (n1,n+1),每条不合法的路径翻转后都是一条到 (n1,n+1) 的路径,而每条到 (n1,n+1) 的路径翻转后都是一条不合法路径,也就是说不合法路径和经过 y=x+1 的路径是一一对应的。所以答案减去 C(2n,n1) 即可。我们得到卡特兰数的公式 Cn=(2nn)(2nn1)(n1)

卡特兰数还有其他常用的公式:

公式化简:Cn=(2nn)n+1(n2)。可以把开始推的式子写出来。Cn=(2n)!n!n!(2n)!(n1)!(n+1)!。硬提出来 1n+1 得到 1n+1×((2n)!(n+1)n!n!(2n)!n!(n1)!)。然后显然硬把后面那个通分得到 1n+1×(2n)!(n+1)(2n)!nn!n!。化简得到 (2nn)n+1

递推形式:Cn=i=0nCi1×Cni(n2) 以及 Cn=(4n2)Cn1n+1(n1)。不证。

posted @   Wind_Leaves_ShaDow  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示