组合数学&二项式
排列组合
加法原理
在从 \(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\)。
排列数计算公式如下:
全排列: 一个长为 \(n\) 的数列的排列方式,即 \(A_n^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。
其中组合数也称为二项式系数。
关于组合数公式的理解
从 \(n\) 个元素中选出 \(m\) 个元素组成的集合是不考虑元素间的顺序的,也就是说选出的 \(m\) 个元素要除去它们的排列数 \(A_m^m\) ,也就是 \(m!\)。
二项式系数
二项式系数就是前面说到的 \(\binom{n}{m}\)。
二项式推论/组合数性质
阶乘展开式
对称恒等式
相当于取补集,从 \(n\) 个里面取 \(n-m\) 个就相当于从 \(n\) 个里面排除了 \(m\) 个。
吸收/提取恒等式
加法/归纳恒等式(杨辉三角公式)
上指标反转
三项式版恒等式
二项式定理
二项式定理阐明了一个展开式的系数
二项式定理的证明
当 \(n=1\) 时,显然成立。
当 \(n>1\) 时,设 \(m=n-1\),则 \(n=m+1\)。
证毕。
平行求和法
上指标求和法
范德蒙德卷积公式
李善兰恒等式
二项式反演
记:
- \(f_n\) 表示恰好 \(n\) 个元素组成特定结构的方案数。
- \(g_n\) 表示至多 \(n\) 个元素组成特定结构的方案数。
对于 \(g_n\) 显然有:
对于 $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\) 则有:
证明
将 \(g_i\) 展开,得:
改为先枚举 \(j\) 后枚举 \(i\),注意要保证 \(i\ge j\),得:
由「三项式版恒等式」得:
令 \(k=i-j\),则 \(i=k+j\),带入,得:
再令 \(m=n-j\),另外将 \((-1)^{n-j-k}\) 写成 \(1^k\times (-1)^{n-j-k}\),得:
可以发现后面这个 \(\sum_{k=0}^{m}\binom{m}{k}\space 1^k\times (-1)^{m-k}\) 和「二项式定理」很像,于是使用二项式定理合并,得:
着这里,我们假定 \(0^0\) 为 \(1\) 发现当且仅当 \(n=j\) 时 \(m=0\),\((1-1)^m=1\),所以式子可以写成:
发现除 \(j=n\) 之外的项的值为 \(0\),所以:
证毕。
像这种从 \(g_n\) 求得 \(f_n\) 的过程就是二项式反演。
卡特兰数(Catalan)
引入
卡特兰数自然是由卡特兰(比利时数学家 Eugène Charles Catalan)发明的,在 1985 年研究括号序列计数问题时发现,并因此而得名。
清朝数学家明安图早在 18 世纪 30 年代就已经发现该序列。所以为什么不是明安图数
设 \(C_i\) 表示卡特兰数列的第 \(i\) 项。
卡特兰数列满足如下递推式:
没人会像我一样用这个式子去求
卡特兰数的前 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\),就可以得到递推式:
同时令 \(i=k-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=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)\)
于是可以写出递推式:
令 \(i=k+2\),可以得到:
可以得出 \(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}\) 根据乘法原理,可以列出递推式:
同时令 \(i=k-1\) 可以得到:
可以得出 \(T_n=C_n\)。
即答案就是 \(C_n\)。
常见变形
既然卡特兰数应用这么广泛,但按上述公式求的话时间复杂度直接飞起来,我们需要更快的求解方法。

浙公网安备 33010602011771号