组合数学入门 Day1

参考教材是清华大学出版社《组合数学》第五版。

第一章 如何组CP 组合(C)与排列(P)

1.1 加法法则和乘法法则

⚠两类事件性质无关,否则考虑容斥原理。

1.2 一一对应法

⚠一一对应的证明不仅要说明事件 \(A\) 对应事件 \(B\) ,也要说明 \(B\) 对应 \(A\)

Cayley定理:\(n\) 个点的有编号无根树有 \(n^{n-2}\)​ 种。

证明方法就是用一一对应的思想,转化为一个 \(n-2\) 的数列,即 Prufer 数列。

Prufer 数列

树转数列

  1. 选出编号最小的叶子节点。
  2. 数列中加入与该叶子节点相连节点的编号。
  3. 在树上删除该叶子节点。
  4. 重复上述过程,直到树上只剩下两个节点。

数列转树

理解一下上述过程:

  • 叶子节点肯定不在 Prufer 数列中。
  • 找出的叶子节点是编号最小的。
  • 删除一个叶子后,仍然保持树的结构,可以看成一个子问题。

所以可倒推出以下过程:

  1. 在数列中取出最前面的元素 \(x\)
  2. 树点集中找到编号最小的且未在数列中出现的元素 \(y\)​。
  3. 连边 \((x,y)\)​,然后分别删除 \(x,y\)
  4. 重复上述过程,直到点集中剩下两个节点, 直接连边。

常用性质

  1. 点度=数列中该点编号出现次数。
  2. 一棵 \(n\) 个点的无根树唯一对应一个长度为 \(n-2\)​ 的数列,数列内每个数 \(\in[1, n]\)
  3. Caylay 定理(见上)。
  4. 由 3 可知,\(n\)​​ 个点的有编号有根树有 \(n^{n-2}\times n = n^{n-1}\)​​ 种。

1.3 排列与组合

排列:考虑顺序。组合:不考虑顺序。

\(P(n,m)=\frac{n!}{(n-m)!}=n^{\underline m}\)​,其中 \(n^{\underline m}\)​​ 表示 \(n\)\(m\) 阶下降幂,定义式等同于排列 \(P(n,m)\)​。

  • \(n^{\underline n} = n!\)

\(C(n,m)=\frac{n!}{m!(n-m)!}=\frac{n^{\underline m}}{m!}\)

一些技巧:打包法,隔板法,合法=全体-非法……

1.4 圆周排列

\(Q(n,m)=\frac{P(n,m)}{m}\)

1.5 排列的生成算法

序数法

\(n!-1=\sum_{k=1}^{n-1}k\cdot k!\)​,可得 \([0, n!)\) 以内的整数 \(m\)​ 可以唯一地表示为

\[m=\sum_{k=1}^{n-1}a_{k}k!,0\le a_k\le k \]

简单尝试一下,发现这很类似进制转换。(震惊)

所以 \([0, n!)\)​ 以内的整数与序数 \((a_{n-1},a_{n-2},\cdots,a_2,a_1)\)​ 一一对应。

\(m\)​​​ 求序数也可以用类似进制转换的思路:

\[m_i = \begin{cases} m, & i = 1 \\ \left \lfloor\frac{m_{i-1}}{i} \right \rfloor, & i > 1 \end{cases} \]

\[a_i\equiv \left \lfloor\frac{m_{i}}{i + 1} \right \rfloor \pmod{i} \]

所以一个 \(n\)​ 个元素(不妨令 \(i\)\(1,2,\cdots, n\) )的全排列可以与序数 \((a_{n-1},a_{n-2},\cdots,a_2,a_1)\)​​ 一一对应。

对应规则为:\(a_i\) 表示排列中元素 \(i+1\) 右(左)侧比 \(i+1\) 小的数的个数。如序数 \((3,1,1)\) 对应排列 \(4,2,3,1\)

字典序法

C++ STL中的 next_permutation

换位法(感觉没啥用)

To be continued...

posted @ 2021-08-02 00:44  Dayu2001  阅读(146)  评论(0)    收藏  举报