组合数学

一些组合数学的证明

组合数

基础内容

定义

定义 (nm) 为在 n 个数中选 m 个数的方案数(不考虑顺序,顺序不同算一个),等同于 Cnm

Anm=n!(nm)!,Cnm=Anmm!=n!(nm)!m!=n!m!(nm)!.

阶乘与下降幂

an={1n=0a×(a1)n1n1

an=a(a1)(a2)(an+1)=a!(an)!=Aan

广义二项式系数: (an)=ann!

对称公式: (nm)=(nnm)

加法公式: (nm)=(n1m)+(n1m1)

吸收公式: m(nm)=n(n1m1)

三项式恒等式: (ab)(bc)=(ac)(acbc)

恒等式

上指标求和: i=ab(ia)=(b+1a+1)

平行求和: i=0n(a+ii)=(a+n+1n)

二项式定理

(a+b)n=i=0n(ni)aibni

下降幂也满足二项式定理:

(a+b)n=i=0n(ni)aibni

范德蒙德卷积恒等式: i=0a(ni)(mai)=(n+ma)

上指标范德蒙德卷积恒等式: i=anb(ia)(nib)=(n+1a+b+1)

经典子问题

插板法

Problem 1

n 个相同的球放入 m 个不同的盒子里,每个盒子内可以放 [0,n] 个球,求总方案数。

可以这样理解:共有 n 个球,m1 个隔板,总长度为 n+m1,我们要在其中找到 m1 的位置变成隔板,使得最终有 m 个区间(盒子),所以最终答案为 (n+m1m1)

Problem 2

对于变量 x1,x2,,xn,每个变量都有一个下界 xiai,求满足 i=1nxi=k 的序列的数量。

注意到 Problem 1 其实是当前问题下所有 ai=0 的情况,所以此题我们只需将供选择的位置的数量减去所有 xi 的下界之和即可,即 (i=1n(xiai)+k1k1)

P5520 [yLOI2019]青原樱

我们考虑,因为共有 m 个树苗且两个树苗间都必须要有间隔,所以我们不妨考虑有 m1 个空位,那么剩下的位置就是 nm+1,所以就是在 nm+1 个位置中放置 m 个树苗。

但要注意此题和 Problem 1,2 的不同在于,这里的每个树苗是不同的(即看分类的东西是否相同),即考虑顺序,所以最终的答案是 Anm+1m

环排列

Problem 1

n 个物品中选出 m 个排成一个环,求方案数(旋转算一个,翻转不算一个)。

先考虑选 m 个排成序列的方案数为 Anm,又因为 m 个序列是一个环,所以最终答案是 Anmm

多重集的排列数

k 种不同的元素,每种元素有 ai 个,求将其排成一列的方案数。

先考虑将所有的元素都视为不同种,最后再除去重复的部分,即 (i=1kai)!i=1kai!

特殊数列

组合数相关数列

错排

如果一个序列的每一位的值都与下标不相等,则称这个序列为错位排列。

Problem 1

求长度为 n 的错排数量。

Dn 表示为 n 的错排数量。对于一个排列 a1,a2,,an,记 an=u,则有 un,考虑 au 的取值:

au=n 时,剩下的 n2 个数构成错排,方案数为 (n1)Dn2;当 aun 时,我们交换 anau,此时 au=u,我们将 au 删去,剩下的 n1 个数构成错排,方案数为 (n1)Dn1

所以 Dn=(n1)(Dn1+Dn2)

卡特兰数

Cn 表示长度为 2n 的合法括号序列的数量,则称序列 C 为卡特兰数。

枚举第一个括号内部的括号数量 Ci,则转移式为 Cn=i=1n1(CiCn1i)

关于卡特兰数常见的公式:

Cn=(2nn)n+1Cn=Cn1(4n2)n+1Cn=(2nn)(2nn1)

同时,Cn 还表示 n 个点的二叉树的数量、n 个元素依次出栈的出栈序列个数等。

P4921[MtOI2018]情侣?给我烧了!

g(n) 表示 n 对情侣全部错开的方案数,则最终答案为 (nk)nk2kg(nk)【选 k 个情侣、k 个情侣的排数、每对情侣的男女的相对位置、其他 nk 个情侣全部错开】

考虑预处理计算 g(n)

分别考虑第一排两个人的情况:

  1. 两个男生

    则选出两个男生的方案数为 n(n1),再考虑他们伴侣的情况:

    当其伴侣相邻时,则剩余的 n2 对情侣也需要全部错开,方案数为 2(n1)g(n2)【两个女生在同一排、其他情侣也全部错开】;如果不相邻,则假定他们是一对情侣,此时需要有 n1 个情侣不相邻,即 g(n1)

    所以总方案数为 n(n1)(2(n1)g(n2)+g(n1))

  2. 两个女生

    同上,总方案数为 n(n1)(2(n1)g(n2)+g(n1))

  3. 一男一女

    因为是 n 个情侣错开,所以这一男一女一定不是情侣。

    1,选出第一排的这两个人的方案为 2n(n1)【一男一女的左右位置、选出一男一女】,伴侣相邻的方案数为 2(n1)g(n2),不相邻的方案数为 g(n1),总方案数为 2n(n1)(2(n1)g(n2)+g(n1))

    综上所述,可以得出 g(n) 的递推式 g(n)=4n(n1)(2(n1)g(n2)+g(n1))

第二类斯特林数

基础定义及求法

定义第二类斯特林数 {nm} 表示将 n 个不同元素划分成 m 个集合(集合无标号且不能有空集)的方案数。

考虑递推计算 {nm},当加入第 n 个元素时,存在一下两种情况:

将新元素单独放入一个子集,方案数为 {n1m1}

将新元素放入一个现有的非空子集,方案数为 m× {n1m}

利用加法公式,可得递推式 {nm}=m{n1m}+{n1m1},边界条件为 {n0}=[n=0]

普通幂转下降幂

mn=i=0n{ni}mi

证明:

考虑组合意义,等式左侧可以看成把 n 个物品放入 m 个有标号盒子的方案数;等式右边可以看做枚举非空的盒子数量 i,放入 i 个无编号非空盒子的方案数是 {nm},给这 i 个盒子分配编号的方案数是 mi,然后对 i 求和。

自然数 k 次幂和

给定 n(n109),k(k5000),求 i=0nik

常见方法是使用拉格朗日插值 O(k) 解决,这里给出使用第二类斯特林数解决的方法。

根据广义二项式系数 (an)=ann! 可得 an=n!(an),同时套用普通幂转下降幂,我们可得到原式 =i=0nj=0k{kj}j!(ij)

交换一下位置,可得 j=0k{kj}j!i=0n(ij)

因为当 ij(ij) 才有意义(即 i<j 时无意义),所以原式可变形为 j=0k{kj}j!i=jn(ij)

此时我们套用上指标求和公式 i=ab(ia)=(b+1a+1),可得原式为 j=0k{kj}j!(n+1j+1)

接下来,我们先让原式乘上 j,可得 j=0k{kj}(j+1)!(n+1j+1),利用广义二项式系数 (an)=ann! 可得 n!(an)=an,我们令原式中的 j+1 为此处的 n,令原式中的 n+1 为此处的 a,可得 j=0k{kj}(n+1)j+1。最后为了等式平衡,除以原先乘上的 j,得到最终结果 j=0k{kj}(n+1)j+1j+1

P6620 [省选联考 2020 A 卷] 组合数问题

给定 n,x,p,mm 次多项式 f(x)=i=0maixi,求 (k=0nf(k)×xk×(nk))modp

其中,1n,x,p109,0ai109,0mmin(n,1000)

考虑将 f(x) 中的单项式转化为下降幂的形式,即 f(x)=i=0mbixi

接下来考虑如何计算 b

我们先对原式使用普通幂转下降幂的形式,将 f(x) 中的单项式展开,得到 f(x)=i=0maij=0i{ij}xj

稍作改写,可得 f(x)=j=0m(i=jmai{ij})xj),因此我们可得 bi=j=imaj{ji}

f(x) 带入原式中,可得 k=0ni=0mbiki(nk)xk

利用广义二项式系数变形 + 改变位置可得 i=0mbii!k=in(ki)(nk)xk

再利用三项式恒等式 (ab)(bc)=(ac)(acbc) 并稍作改写可得 i=0mbii!(ni)k=in(nik1)xk

不难发现它等同于 i=0mbii!(ni)k=0ni(nik)xk+i,然后将 xk+i 拆成 xkxi,并将 xi 提到外面,得 i=0mbii!(ni)xik=0ni(nik)xk

接下来利用二项式定理 (a+b)n=i=0n(ni)aibni,令 a=x,b=1,i=k,n=ni,此时我们可以忽略 b 的影响,得到最终式子为 i=0mbii!(ni)xi(x+1)ni

最终,我们可以达到 O(m) 的计算和 O(m2) 预处理的复杂度。

其他组合定理

鸽巢原理

n+1 个球放入 n 个盒子中,至少有一个盒子里有至少 2 个球。

推广:把 n 个球放入 k 个盒子中,则至少有一个盒子里有 nk 个球,至少有一个盒子里有 nk 个球。

CF1305C Kuroni and Impossible Calculation

给定长度为 n 的序列 a 和一个整数 m,求 1i<jn|aiaj|modm

2n2×105,1m1000,0ai109

考虑若存在一组 i,j 使得 aiaj(modm),则答案为 0。由鸽巢原理可知当 n>m 时必然有一组满足条件的 i,j,因此只需暴力考虑 nm 的情况。

Prufer 序列

Prufer 序列可以将一个带标号 n 个节点的树用 [1,n] 中的 n2 个整数表示(即 n 个点的完全图的生成树与长度为 n2 值域为 [1,n] 的数列构成的双射)。

构造方式如下:

每次选择一个编号最小的叶子节点并删掉它,然后在序列中记录下它连接到的那个节点的编号,重复 n2 次后就只剩下两个节点,算法结束。

Prufer 序列与树的相互转化

给定树,求 Prufer 序列:

用堆维护所有的叶子节点即可。

给定 Prufer 序列求树:

首先给出结论:度数为 a 的点在 Prufer 序列中的出现次数为 a1

具体构造方法如下:

  1. 取出 Prufer 序列中最前面的元素 x

  2. 取出在点集中的、且当前不在 Prufer 序列中的最小元素 y

  3. x,y 之间连边(注意将 y 从点集中删除,并将其在 Prufer 序列里的出现次数减一)。

  4. 最后将点集中剩下的两个点连边

凯莱定理

n 个点的无根树计数

n 个点的有标号无根树的个数是 nn2(即 n 个点的完全图的生成树的数量是 nn2)。

不难证明任意一个长度为 n2 的 Prufer 序列都可以构造出一个各不相同的生成树,值域在 [1,n],故总数为 nn2

n 个点的有根树计数

对于每棵无根树来说,每个点都有可能成为根,所以总数为 nn1

n 个点的每个度数分别为 di 的无根树计数(P2290 [HNOI2004] 树的计数)

根据 Prufer 序列的性质,我们可以知道度数为 di 的点在 Prufer 序列中出现 di1 次,那么这其实就是可重集排列数了,总共 n2 个位置,每个 di 会出现 di1 次,套上可重集排列数的公式,可得答案为 (n2)!i=1n(di1)!

Burnside 引理

Polya 定理

P4980【模板】Polya定理

给定一个 n 个点,n 条边的环,有 n 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,对 109+7 取模。

我们称两个环本质不同,当且仅当不能通过旋转使得它们变得完全相同。

T 组数据,T103,n109

对于一个环,我们称它任意旋转能得到的所有环构成一个轨道。轨道是环的集合,与生成这个集合的初始环无关。显然所有的环都分成了若干个轨道,而答案就是轨道的数量。

对于任意一个环,都存在一个最小的正整数 d,使得这个环在旋转 d 格后会与自身重合。我们称 d 为这个环的最小循环节,容易发现,这个环所在轨道的大小为 d,且 d 一定是 n 的因子。

把旋转看作变换,变换可以作用于环上,把一个环变成另一个环。

那么一共有 n 种变换。对于一个环,所以保持这个环不变的变换被称为这个环的稳定子。容易发现,一个循环节为 d 的环的稳定子大小为 nd

对于任意一个轨道,轨道内每个环的稳定子大小相等,且稳定子大小乘轨道大小等于 n

由于一个轨道内所有环的稳定子大小之和恰好为 n,因此,所有环的稳定子大小之和就等于 ans×n。令 cric 表示变换,则有:ans×n=cricnd(cric)

算了,估了,反正也不会。

容斥原理

基本容斥

当我们需要计算不满足条件 A 的方案数时,有时可以使用总方案数来减去满足条件 A 的方案数。

C[!A(C)]=C1C[A(C)],其中 C 表示一种方案,A(C) 表示这种方案是否满足条件 A

posted @   CheZiHe929  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 历时 8 年,我冲上开源榜前 8 了!
· 物流快递公司核心技术能力-海量大数据处理技术
· 四大AI编程工具组合测评
· 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案
· 如何在 Github 上获得 1000 star?
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起