组合数学&二项式

排列组合

加法原理

在从 \(A\)\(B\) 的所有路径中,只经过 \(C\) 的有 \(x\) 条,只经过 \(D\) 的有 \(y\) 条,没有既经过 \(C\) 又经过 \(D\) 的路径,也没有既不经过 \(C\) 也不经过 \(D\) 的路径,那么从 \(A\)\(B\) 共有 \(x+y\) 条路径。

乘法原理

\(A\)\(C\)\(x\) 条路径,从 \(C\)\(B\)\(y\) 条路径,没有不经过 \(C\) 的路径,那么从 \(A\)\(B\) 共有 \(x\times y\) 条路径。

排列数与组合数

排列数

\(n\) 个不同元素中选 \(m\) 个元素,按照一定顺序排成一列,称为\(n\) 个不同元素中取出 \(m\) 个元素的排列,排列的方案数,叫做\(n\) 个不同元素中取出 \(m\) 个元素的排列数,记为 \(A_n^m\)\(P_n^m\)
排列数计算公式如下:

\[A_n^m=n(n-1)(n-2)\cdots(n-m+1)=\frac{n!}{(n-m)!} \]

全排列: 一个长为 \(n\) 的数列的排列方式,即 \(A_n^n\)

\[A_n^n=n(n-1)(n-2)\cdots 2 \times 1=n! \]

对于排列数公式的理解

\(n\) 个元素,要取出 \(m\) 个,第一个位置有 \(n\) 种放法,由于已经放了一个元素,所以第二个位置就有 \(n-1\) 种放法……第 \(m\) 个位置就有 \(n-m+1\) 种放法。
最后根据乘法原理,相乘即为 \(A_n^m\)

组合数

\(n\) 个不同元素中选 \(m\) 个元素组成的集合,叫做\(n\) 个不同元素中取出 \(m\) 个元素的组合,形成组合的方案数称为\(n\) 个不同元素中取出 \(m\) 个元素的组合数,记为 \(C_n^m\),但现在数学界常采用 \(\binom{n}{m}\) 来表示,读作n 选 m

\[\binom{n}{m}=\frac{A_n^m}{m!}=\frac{n!}{m!(n-m)!} \]

其中组合数也称为二项式系数

关于组合数公式的理解

\(n\) 个元素中选出 \(m\) 个元素组成的集合是不考虑元素间的顺序的,也就是说选出的 \(m\) 个元素要除去它们的排列数 \(A_m^m\) ,也就是 \(m!\)

二项式系数

二项式系数就是前面说到的 \(\binom{n}{m}\)

二项式推论/组合数性质

阶乘展开式

\[\binom{n}{m}=\frac{n!}{m!(n-m)!} \]

对称恒等式

\[\binom{n}{m}=\binom{n}{n-m} \]

相当于取补集,从 \(n\) 个里面取 \(n-m\) 个就相当于从 \(n\) 个里面排除了 \(m\) 个。

吸收/提取恒等式

\[\binom{n}{m}=\frac{n}{m}\binom{n-1}{m-1} \]

加法/归纳恒等式(杨辉三角公式)

\[\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1} \]

上指标反转

\[\binom{n}{m}=(-1)^{m}\binom{m-n-1}{m} \]

三项式版恒等式

\[\binom{n}{m}\binom{m}{k}=\binom{n}{k}\binom{n-k}{m-k} \]

二项式定理

二项式定理阐明了一个展开式的系数

\[(a+b)^n=\sum_{i=0}^{n}{\binom{n}{i}a^ib^{n-i}} \]

二项式定理的证明

\(n=1\) 时,显然成立。
\(n>1\) 时,设 \(m=n-1\),则 \(n=m+1\)

\[\begin{aligned} (a+b)^n &= (a+b)(a+b)^m\\ &=(a+b)\sum_{i=0}^{m}\binom{m}{i}a^ib^{m-i}\\ &=\sum_{i=0}^{m}\binom{m}{i}a^{i+1}b^{m-i}+\sum_{i=0}^{m}\binom{m}{i}a^{i}b^{m-i+1}\\ &=\sum_{i=1}^{m+1}\binom{m}{i-1}a^ib^{m-i+1}+\sum_{i=0}^{m}\binom{m}{i}a^{i}b^{m-i+1}\\ &=\sum_{i=0}^{m+1}\left[\binom{m}{i-1}+\binom{m}{i}\right]a^{i}b^{m-i+1}\\ &=\sum_{i=0}^{m+1}\binom{m+1}{i}a^ib^{m+1-i}\\ &=\sum_{i=0}^{n}{\binom{n}{i}a^ib^{n-i}} \end{aligned}\]

证毕。

平行求和法

\[\sum_{k=0}^{n}\binom{m+k}{k}=\binom{m+n+1}{n} \]

上指标求和法

\[\sum_{k=0}^{n}\binom{k}{m}=\binom{n+1}{m+1} \]

范德蒙德卷积公式

\[\sum_{k=0}^{n}\binom{r}{k}\binom{s}{n-k}=\binom{r+s}{n} \]

李善兰恒等式

\[\binom{n+k}{k}=\sum_{j=0}^{k}\binom{k}{j}^2\binom{n+2k-j}{2k} \]

二项式反演

记:

  • \(f_n\) 表示恰好 \(n\) 个元素组成特定结构的方案数。
  • \(g_n\) 表示至多 \(n\) 个元素组成特定结构的方案数。

对于 \(g_n\) 显然有:

\[g_n=\sum_{i=0}^{n}\binom{n}{i}f_i \]

对于 $g_n=\sum_{i=0}^{n}\binom{n}{i}f_i$ 的理解

既然 \(g_n\) 表示「至多」,那么肯定是有 \(n\) 个「恰好」相加得到,\(f_i\) 就是这个「恰好」,考虑到 \(f_i\) 的组合方式显然有 \(\binom{n}{i}\) 种,根据乘法原理「恰好\(i\) 个的贡献就是 \(\binom{n}{i}f_i\),再根据加法原理相加即可得到 \(g_n\)

对于 \(f_n\) 则有:

\[f_n=\sum_{i=0}^{n}\binom{n}{i}(-1)^{n-i}g_i \]

证明

\(g_i\) 展开,得:

\[\begin{aligned} f_n&=\sum_{i=0}^{n}\binom{n}{i}(-1)^{n-i}\left[\sum_{j=0}^{i}\binom{i}{j}f_j\right]\\ &=\sum_{i=0}^{n}\sum_{j=0}^{i}\binom{n}{i}\binom{i}{j}(-1)^{n-i}f_j \end{aligned}\]

改为先枚举 \(j\) 后枚举 \(i\),注意要保证 \(i\ge j\),得:

\[\begin{aligned} f_n&=\sum_{j=0}^{n}\sum_{i=j}^{n}\binom{n}{i}\binom{i}{j}(-1)^{n-i}f_j\\ &=\sum_{j=0}^{n}f_j\sum_{i=j}^{n}\binom{n}{i}\binom{i}{j}(-1)^{n-i} \end{aligned}\]

由「三项式版恒等式」得:

\[\begin{aligned} f_n&=\sum_{j=0}^{n}f_j\sum_{i=j}^{n}\binom{n}{j}\binom{n-j}{i-j}(-1)^{n-i}\\ &=\sum_{j=0}^{n}\binom{n}{j}f_j\sum_{i=j}^{n}\binom{n-j}{i-j}(-1)^{n-i} \end{aligned}\]

\(k=i-j\),则 \(i=k+j\),带入,得:

\[\begin{aligned} f_n&=\sum_{j=0}^{n}\binom{n}{j}f_j\sum_{k=0}^{n-j}\binom{n-j}{k}(-1)^{n-j-k} \end{aligned}\]

再令 \(m=n-j\),另外将 \((-1)^{n-j-k}\) 写成 \(1^k\times (-1)^{n-j-k}\),得:

\[\begin{aligned} f_n&=\sum_{j=0}^{n}\binom{n}{j}f_j\sum_{k=0}^{m}\binom{m}{k}\space 1^k\times (-1)^{m-k} \end{aligned}\]

可以发现后面这个 \(\sum_{k=0}^{m}\binom{m}{k}\space 1^k\times (-1)^{m-k}\) 和「二项式定理」很像,于是使用二项式定理合并,得:

\[f_n=\sum_{j=0}^{n}\binom{n}{j}f_j(1-1)^{m} \]

着这里,我们假定 \(0^0\)\(1\) 发现当且仅当 \(n=j\)\(m=0\)\((1-1)^m=1\),所以式子可以写成:

\[f_n=\sum_{j=0}^{n}\binom{n}{j}f_j[n=j] \]

发现除 \(j=n\) 之外的项的值为 \(0\),所以:

\[f_n=\binom{n}{n}f_n=f_n \]

证毕。

像这种从 \(g_n\) 求得 \(f_n\) 的过程就是二项式反演

卡特兰数(Catalan)

引入

卡特兰数自然是由卡特兰(比利时数学家 Eugène Charles Catalan)发明的,在 1985 年研究括号序列计数问题时发现,并因此而得名。
清朝数学家明安图早在 18 世纪 30 年代就已经发现该序列。所以为什么不是明安图数

\(C_i\) 表示卡特兰数列的第 \(i\) 项。
卡特兰数列满足如下递推式:

\[C_n=\left\{ \begin{array}{c} 1 & n=0\\ \sum_{i=0}^{n-1}C_{i}C_{n-i-1} & n>0 \end{array} \right.\]

没人会像我一样用这个式子去求

卡特兰数的前 100 项
0       1
1       1
2       2
3       5
4       14
5       42
6       132
7       429
8       1430
9       4862
10      16796
11      58786
12      208012
13      742900
14      2674440
15      9694845
16      35357670
17      129644790
18      477638700
19      1767263190
20      6564120420
21      24466267020
22      91482563640
23      343059613650
24      1289904147324
25      4861946401452
26      18367353072152
27      69533550916004
28      263747951750360
29      1002242216651368
30      3814986502092304
31      14544636039226909
32      55534064877048198
33      212336130412243110
34      812944042149730764
35      3116285494907301262
36      11959798385860453492
37      45950804324621742364
38      176733862787006701400
39      680425371729975800390
40      2622127042276492108820
41      10113918591637898134020
42      39044429911904443959240
43      150853479205085351660700
44      583300119592996693088040
45      2257117854077248073253720
46      8740328711533173390046320
47      33868773757191046886429490
48      131327898242169365477991900
49      509552245179617138054608572
50      1978261657756160653623774456
51      7684785670514316385230816156
52      29869166945772625950142417512
53      116157871455782434250553845880
54      451959718027953471447609509424
55      1759414616608818870992479875972
56      6852456927844873497549658464312
57      26700952856774851904245220912664
58      104088460289122304033498318812080
59      405944995127576985730643443367112
60      1583850964596120042686772779038896
61      6182127958584855650487080847216336
62      24139737743045626825711458546273312
63      94295850558771979787935384946380125
64      368479169875816659479009042713546950
65      1440418573150919668872489894243865350
66      5632681584560312734993915705849145100
67      22033725021956517463358552614056949950
68      86218923998960285726185640663701108500
69      337485502510215975556783793455058624700
70      1321422108420282270489942177190229544600
71      5175569924646105559418940193995065716350
72      20276890389709399862928998568254641025700
73      79463489365077377841208237632349268884500
74      311496878311103321137536291518809134027240
75      1221395654430378811828760722007962130791020
76      4790408930363303911328386208394864461024520
77      18793142726809884575211361279087545193250040
78      73745243611532458459690151854647329239335600
79      289450081175264899454283846029490767264392230
80      1136359577947336271931632877004667456667613940
81      4462290049988320482463241297506133183499654740
82      17526585015616776834735140517915655636396234280
83      68854441132780194707888052034668647142985206100
84      270557451039395118028642463289168566420671280440
85      1063353702922273835973036658043476458723103404520
86      4180080073556524734514695828170907458428751314320
87      16435314834665426797069144960762886143367590394940
88      64633260585762914370496637486146181462681535261000
89      254224158304000796523953440778841647086547372026600
90      1000134600800354781929399250536541864362461089950800
91      3935312233584004685417853572763349509774031680023800
92      15487357822491889407128326963778343232013931127835600
93      60960876535340415751462563580829648891969728907438000
94      239993345518077005168915776623476723006280827488229600
95      944973797977428207852605870454939596837230758234904050
96      3721443204405954385563870541379246659709506697378694300
97      14657929356129575437016877846657032761712954950899755100
98      57743358069601357782187700608042856334020731624756611000
99      227508830794229349661819540395688853956041682601541047340
100     896519947090131496687170070074100632420837521538745909320

应用

卡特兰数因其天然的递归就结构,可以通过枚举分界点,将规模为 \(n\) 的问题拆分成两个规模为 \(i\)\(n-i-1\) 的两个子问题,这使得卡特兰数出现在很多具有类似递归结构的问题中:

1.路径计数问题

有一个 \(n\times n\) 的方格,从左下角 \((0,0)\) 到右上角 \((n,n)\),只向上或向右走且不越过对角线\(y=x\) 的方案数。

设方案数为 \(T_n\),考虑 \(n\ge2\) 的情况。
设第一次走到对角线的点是 \((k,k),k\in[1,n]\) 我们考虑从 \((0,0)\)\((k,k)\) 的路径。
经过观察发现,这些路径开始都是向右,最后都是向上,那么问题就可以转换为从 \((1,0)\)\((k,k-1)\) 不越过直线 \(y=x-1\) 的路径,这样的路径数就是 \(T_{k-1}\),同理,从 \((k,k)\)\((n,n)\) 的方案数就是 \(T_{n-k}\) ,最后根据乘法原理,第一次在 \(k\) 处触碰对角线的方案数就是 \(T_{k-1}T_{n-k}\),我们枚举所有 \(k\),就可以得到递推式:

\[T_n=\sum_{k=1}^{n}T_{k-1}T_{n-k} \]

同时令 \(i=k-1\) 可以得到:

\[T_n=\sum_{i=0}^{n-1}T_{i}T_{n-i-1} \]

可以得出 \(T_n=C_n\)
即答案就是 \(C_n\)

2.括号序列计数问题

求由 \(n\) 对括号组成的合法括号序列数。

类似于问题1的求解过程,将添加一个左括号视为向右走,添加一个有括号视为向上走,满足 \(左括号数 \ge 右括号数\),即是不越过对角线 \(y=x\),可以得出该问题与上一个问题等价。
答案为 \(C_n\)

3.出栈序列计数问题

求一个栈入栈序列为 \(1,2,3,\cdots,n\),的合法出栈方案数。

类似于问题1的求解过程,将入栈视为向左走,出栈视为向上走,任意时刻满足 \(入栈数\ge 出栈数\),即是不越过对角线 \(y=x\),可以得出该问题于问题1等价。
答案为 \(C_n\)

4.二叉树计数问题

\(n\) 个节点构成的二叉树的方案数。

设答案为 \(T_n\),去任意一个根节点,枚举左右子树大小。
设左子树大小为 \(i\in[0,n-1]\) ,右子树大小为 \(n-i-1\),则可以列出递推式:

\[T_n=\sum_{i=0}^{n-1}T_{i}T_{n-i-1} \]

可以得出 \(T_n=C_n\)
即答案就是 \(C_n\)

5.三角剖分计数问题

将一个凸多边形分成三角形(对角线不相交)区域的方案数。

\((n+2)\) 边形的三角形剖分方案数为 \(T_n\),先选一条边 \((1,n+2)\) 作为基边,那么这条边一定属于一个三角形,我们设三角形的第三个点为 \(k,k\in[2,n+1]\)
这样,\((n+2)\) 边形就被分成了三个部分;

  • 三角形 \((1,k,n+2)\)
  • \(k\) 边形 \((1,2,\cdots,k)\)
  • \((n+3-k)\) 边形 \((k,k+1,\cdots,n+2)\)

于是可以写出递推式:

\[T_n=\sum_{k=2}^{n+1}{T_{k-2}T_{n+1-k}} \]

\(i=k+2\),可以得到:

\[T_n=\sum_{i=0}^{n-1}T_{i}T_{n-i-1} \]

可以得出 \(T_n=C_n\)
即答案就是 \(C_n\)

6.圆内不相交弦计数问题

圆上由 \(2n\) 个点,求将这些点之间连线且不相交的方案数。

\(2n\) 个节点的方案数为 \(T_n\),将 \(2n\) 个节点按顺时针标号,分别为 \(1,2,3,\cdots,2n\)
为了使线之间不想交,\(1\) 号节点只能连偶数节点,否则连点间就会有奇数个点,无法实现两两配对。
\(1\)\(2k\) 连线,那么左边有 \(2k-2\) 个点,右边有 \(2n-2k\) 个点,那么左边的方案数就是 \(T_{k-1}\) 右边的方案数就是 \(T_{n-k}\) 根据乘法原理,可以列出递推式:

\[T_n=\sum_{k=1}^{n}T_{k-1}T_{n-k} \]

同时令 \(i=k-1\) 可以得到:

\[T_n=\sum_{i=0}^{n-1}T_{i}T_{n-i-1} \]

可以得出 \(T_n=C_n\)
即答案就是 \(C_n\)

常见变形

既然卡特兰数应用这么广泛,但按上述公式求的话时间复杂度直接飞起来,我们需要更快的求解方法。

\[\begin{array}{l} C_n=\frac{1}{n+1}\binom{2n}{n}=\frac{(2n)!}{n!(n+1)!} & n>0 && (2)\\ C_n=\binom{2n}{n}-\binom{2n}{n+1} & n>0 && (3)\\ C_n=\frac{(4n-2)}{n+1}C_{n-1} & n>0 &&(4) \end{array}\]

posted @ 2026-06-30 10:53  LZYXT  阅读(21)  评论(0)    收藏  举报