一个蒟蒻小学生尝试学习高级排列组合
呃呃呃呃呃呃,我不咋会写,如有不对的地方欢迎纠正
紧接上文我们已经了解了基础的排列组合,我们可以接着往下学习排列组合的变种了.
1.排列组合的变种
1-1.多重集的排列数 + 多重组合数
大家一定要区分 多重组合数 与 多重集的组合数!两者是完全不同的概念!
多重集是指包含重复元素的广义集合。设
S
=
{
n
1
⋅
a
1
,
n
2
⋅
a
2
,
⋯
,
n
k
⋅
a
k
}
S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k\}
S={n1⋅a1,n2⋅a2,⋯,nk⋅ak} 表示由
n
1
n_1
n1 个
a
1
a_1
a1,
n
2
n_2
n2 个
a
2
a_2
a2,…,
n
k
n_k
nk 个
a
k
a_k
ak 组成的多重集,
S
S
S 的全排列个数为
n
!
∏
i
=
1
k
n
i
!
=
n
!
n
1
!
n
2
!
⋯
n
k
!
\frac{n!}{\prod_{i=1}^kn_i!}=\frac{n!}{n_1!n_2!\cdots n_k!}
∏i=1kni!n!=n1!n2!⋯nk!n!
相当于把相同元素的排列数除掉了。具体地,你可以认为你有
k
k
k 种不一样的球,每种球的个数分别是
n
1
,
n
2
,
⋯
,
n
k
n_1,n_2,\cdots,n_k
n1,n2,⋯,nk,且
n
=
n
1
+
n
2
+
…
+
n
k
n=n_1+n_2+\ldots+n_k
n=n1+n2+…+nk。这
n
n
n 个球的全排列数就是 多重集的排列数。多重集的排列数常被称作 多重组合数。我们可以用多重组合数的符号表示上式:
(
n
n
1
,
n
2
,
⋯
,
n
k
)
=
n
!
∏
i
=
1
k
n
i
!
\binom{n}{n_1,n_2,\cdots,n_k}=\frac{n!}{\prod_{i=1}^kn_i!}
(n1,n2,⋯,nkn)=∏i=1kni!n!
可以看出, ( n m ) \dbinom{n}{m} (mn) 等价于 , ( n m , n − m ) \dbinom{n}{m,n-m} (m,n−mn) 只不过后者较为繁琐,因而不采用。
1-2.多重集的组合数 1
设 S = { n 1 ⋅ a 1 , n 2 ⋅ a 2 , ⋯ , n k ⋅ a k } S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k\} S={n1⋅a1,n2⋅a2,⋯,nk⋅ak} 表示由 n 1 n_1 n1 个 a 1 a_1 a1, n 2 n_2 n2 个 a 2 a_2 a2,…, n k n_k nk 个 a k a_k ak 组成的多重集。那么对于整数 r ( r < n i , ∀ i ∈ [ 1 , k ] ) r(r<n_i,\forall i\in[1,k]) r(r<ni,∀i∈[1,k]),从 S S S 中选择 r r r 个元素组成一个多重集的方案数就是 多重集的组合数。这个问题等价于 x 1 + x 2 + ⋯ + x k = r x_1+x_2+\cdots+x_k=r x1+x2+⋯+xk=r 的非负整数解的数目,可以用插板法解决,答案为
( r + k − 1 k − 1 ) \binom{r+k-1}{k-1} (k−1r+k−1)
1-3.多重集的组合数 2
考虑这个问题:设 S = { n 1 ⋅ a 1 , n 2 ⋅ a 2 , ⋯ , n k ⋅ a k , } S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\} S={n1⋅a1,n2⋅a2,⋯,nk⋅ak,} 表示由 n 1 n_1 n1 个 a 1 a_1 a1, n 2 n_2 n2 个 a 2 a_2 a2,…, n k n_k nk 个 组 a k a_k ak 成的多重集。那么对于正整数 r r r,从 S S S 中选择 r r r 个元素组成一个多重集的方案数。
这样就限制了每种元素的取的个数。同样的,我们可以把这个问题转化为带限制的线性方程求解:
∀
i
∈
[
1
,
k
]
,
x
i
≤
n
i
,
∑
i
=
1
k
x
i
=
r
\forall i\in [1,k],\ x_i\le n_i,\ \sum_{i=1}^kx_i=r
∀i∈[1,k], xi≤ni, i=1∑kxi=r
于是很自然地想到了容斥原理。容斥的模型如下:
- 全集: ∑ i = 1 k x i = r \displaystyle \sum_{i=1}^kx_i=r i=1∑kxi=r 的非负整数解。
- 属性: x i ≤ n i x_i\le n_i xi≤ni。
于是设满足属性
i
i
i 的集合是
S
i
S_i
Si,
S
i
‾
\overline{S_i}
Si 表示不满足属性
i
i
i 的集合,即满足
x
i
≥
n
i
+
1
x_i\ge n_i+1
xi≥ni+1 的集合(转化为上面插板法的问题三)。那么答案即为
∣
⋂
i
=
1
k
S
i
∣
=
∣
U
∣
−
∣
⋃
i
=
1
k
S
i
‾
∣
\left|\bigcap_{i=1}^kS_i\right|=|U|-\left|\bigcup_{i=1}^k\overline{S_i}\right|
i=1⋂kSi
=∣U∣−
i=1⋃kSi
根据容斥原理,有:
∣
⋃
i
=
1
k
S
i
‾
∣
=
∑
i
∣
S
i
‾
∣
−
∑
i
,
j
∣
S
i
‾
∩
S
j
‾
∣
+
∑
i
,
j
,
k
∣
S
i
‾
∩
S
j
‾
∩
S
k
‾
∣
−
⋯
+
(
−
1
)
k
−
1
∣
⋂
i
=
1
k
S
i
‾
∣
=
∑
i
(
k
+
r
−
n
i
−
2
k
−
1
)
−
∑
i
,
j
(
k
+
r
−
n
i
−
n
j
−
3
k
−
1
)
+
∑
i
,
j
,
k
(
k
+
r
−
n
i
−
n
j
−
n
k
−
4
k
−
1
)
−
⋯
+
(
−
1
)
k
−
1
(
k
+
r
−
∑
i
=
1
k
n
i
−
k
−
1
k
−
1
)
\begin{aligned} \left|\bigcup_{i=1}^k\overline{S_i}\right| =&\sum_i\left|\overline{S_i}\right| -\sum_{i,j}\left|\overline{S_i}\cap\overline{S_j}\right| +\sum_{i,j,k}\left|\overline{S_i}\cap\overline{S_j}\cap\overline{S_k}\right| -\cdots\\ &+(-1)^{k-1}\left|\bigcap_{i=1}^k\overline{S_i}\right|\\ =&\sum_i\binom{k+r-n_i-2}{k-1} -\sum_{i,j}\binom{k+r-n_i-n_j-3}{k-1}+\sum_{i,j,k}\binom{k+r-n_i-n_j-n_k-4}{k-1} -\cdots\\ &+(-1)^{k-1}\binom{k+r-\sum_{i=1}^kn_i-k-1}{k-1} \end{aligned}
i=1⋃kSi
==i∑
Si
−i,j∑
Si∩Sj
+i,j,k∑
Si∩Sj∩Sk
−⋯+(−1)k−1
i=1⋂kSi
i∑(k−1k+r−ni−2)−i,j∑(k−1k+r−ni−nj−3)+i,j,k∑(k−1k+r−ni−nj−nk−4)−⋯+(−1)k−1(k−1k+r−∑i=1kni−k−1)
拿全集
∣
U
∣
=
(
k
+
r
−
1
k
−
1
)
\displaystyle |U|=\binom{k+r-1}{k-1}
∣U∣=(k−1k+r−1) 减去上式,得到多重集的组合数
A
n
s
=
∑
p
=
0
k
(
−
1
)
p
∑
A
(
k
+
r
−
1
−
∑
A
n
A
i
−
p
k
−
1
)
Ans=\sum_{p=0}^k(-1)^p\sum_{A}\binom{k+r-1-\sum_{A} n_{A_i}-p}{k-1}
Ans=p=0∑k(−1)pA∑(k−1k+r−1−∑AnAi−p)
其中 A A A 是充当枚举子集的作用,满足 ∣ A ∣ = p , A i < A i + 1 |A|=p,\ A_i<A_{i+1} ∣A∣=p, Ai<Ai+1。
1-4.圆排列
n
n
n 个人全部来围成一圈,所有的排列数记为
Q
n
n
\mathrm Q_n^n
Qnn。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以有
Q
n
n
×
n
=
A
n
n
⟹
Q
n
=
A
n
n
n
=
(
n
−
1
)
!
\mathrm Q_n^n \times n = \mathrm A_n^n \Longrightarrow \mathrm Q_n = \frac{\mathrm A_n^n}{n} = (n-1)!
Qnn×n=Ann⟹Qn=nAnn=(n−1)!
由此可知部分圆排列的公式:
Q
n
r
=
A
n
r
r
=
n
!
r
×
(
n
−
r
)
!
\mathrm Q_n^r = \frac{\mathrm A_n^r}{r} = \frac{n!}{r \times (n-r)!}
Qnr=rAnr=r×(n−r)!n!
2-1.组合数性质 | 二项式推论
由于组合数在 OI 中十分重要,因此在此介绍一些组合数的性质。
(
n
m
)
=
(
n
n
−
m
)
(1)
\binom{n}{m}=\binom{n}{n-m}\tag{1}
(mn)=(n−mn)(1)
相当于将选出的集合对全集取补集,故数值不变。(对称性)
( n k ) = n k ( n − 1 k − 1 ) (2) \binom{n}{k} = \frac{n}{k} \binom{n-1}{k-1}\tag{2} (kn)=kn(k−1n−1)(2)
由定义导出的递推式。
(
n
m
)
=
(
n
−
1
m
)
+
(
n
−
1
m
−
1
)
(3)
\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}\tag{3}
(mn)=(mn−1)+(m−1n−1)(3)
组合数的递推式(杨辉三角的公式表达)。我们可以利用这个式子,在
O
(
n
2
)
O(n^2)
O(n2) 的复杂度下推导组合数。
( n 0 ) + ( n 1 ) + ⋯ + ( n n ) = ∑ i = 0 n ( n i ) = 2 n (4) \binom{n}{0}+\binom{n}{1}+\cdots+\binom{n}{n}=\sum_{i=0}^n\binom{n}{i}=2^n\tag{4} (0n)+(1n)+⋯+(nn)=i=0∑n(in)=2n(4)
这是二项式定理的特殊情况。取 a = b = 1 a=b=1 a=b=1 就得到上式。
∑ i = 0 n ( − 1 ) i ( n i ) = [ n = 0 ] (5) \sum_{i=0}^n(-1)^i\binom{n}{i}=[n=0]\tag{5} i=0∑n(−1)i(in)=[n=0](5)
二项式定理的另一种特殊情况,可取 a = 1 , b = − 1 a=1, b=-1 a=1,b=−1。式子的特殊情况是取 n = 0 n=0 n=0 时答案为 1 1 1
∑ i = 0 m ( n i ) ( m m − i ) = ( m + n m ) ( n ≥ m ) (6) \sum_{i=0}^m \binom{n}{i}\binom{m}{m-i} = \binom{m+n}{m}\ \ \ (n \geq m)\tag{6} i=0∑m(in)(m−im)=(mm+n) (n≥m)(6)
拆组合数的式子,在处理某些数据结构题时会用到。
∑ i = 0 n ( n i ) 2 = ( 2 n n ) (7) \sum_{i=0}^n\binom{n}{i}^2=\binom{2n}{n}\tag{7} i=0∑n(in)2=(n2n)(7)
这是 6 6 6 的特殊情况,取 n = m n=m n=m 即可。
∑ i = 0 n i ( n i ) = n 2 n − 1 (8) \sum_{i=0}^ni\binom{n}{i}=n2^{n-1}\tag{8} i=0∑ni(in)=n2n−1(8)
带权和的一个式子,通过对 3 3 3 对应的多项式函数求导可以得证。
∑ i = 0 n i 2 ( n i ) = n ( n + 1 ) 2 n − 2 (9) \sum_{i=0}^ni^2\binom{n}{i}=n(n+1)2^{n-2}\tag{9} i=0∑ni2(in)=n(n+1)2n−2(9)
与上式类似,可以通过对多项式函数求导证明。
∑ l = 0 n ( l k ) = ( n + 1 k + 1 ) (10) \sum_{l=0}^n\binom{l}{k} = \binom{n+1}{k+1}\tag{10} l=0∑n(kl)=(k+1n+1)(10)
通过组合分析一一考虑 S = { a 1 , a 2 , ⋯ , a n + 1 } S=\{a_1, a_2, \cdots, a_{n+1}\} S={a1,a2,⋯,an+1} 的 k + 1 k+1 k+1 子集数可以得证,在恒等式证明中比较常用。
( n r ) ( r k ) = ( n k ) ( n − k r − k ) (11) \binom{n}{r}\binom{r}{k} = \binom{n}{k}\binom{n-k}{r-k}\tag{11} (rn)(kr)=(kn)(r−kn−k)(11)
通过定义可以证明。
∑ i = 0 n ( n − i i ) = F n + 1 (12) \sum_{i=0}^n\binom{n-i}{i}=F_{n+1}\tag{12} i=0∑n(in−i)=Fn+1(12)
其中 F F F 是斐波那契数列。
2-2.二项式反演
记 $ f_n$ 表示恰好使用 n n n 个不同元素形成特定结构的方案数, g n g_n gn 表示从 n n n 个不同元素中选出 i ≥ 0 i \geq 0 i≥0 个元素形成特定结构的总方案数。
若已知 f n f_n fn 求 g n g_n gn,那么显然有:
g
n
=
∑
i
=
0
n
(
n
i
)
f
i
g_n = \sum_{i = 0}^{n} \binom{n}{i} f_i
gn=i=0∑n(in)fi
若已知
g
n
g_n
gn 求
f
n
f_n
fn,那么:
f
n
=
∑
i
=
0
n
(
n
i
)
(
−
1
)
n
−
i
g
i
f_n = \sum_{i = 0}^{n} \binom{n}{i} (-1)^{n-i} g_i
fn=i=0∑n(in)(−1)n−igi
上述已知
g
n
g_n
gn 求
f
n
f_n
fn 的过程,就称为 二项式反演。
证明
将反演公式的 g i g_i gi 展开得到:
f
n
=
∑
i
=
0
n
(
n
i
)
(
−
1
)
n
−
i
[
∑
j
=
0
i
(
i
j
)
f
j
]
=
∑
i
=
0
n
∑
j
=
0
i
(
n
i
)
(
i
j
)
(
−
1
)
n
−
i
f
j
\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}
fn=i=0∑n(in)(−1)n−i[j=0∑i(ji)fj]=i=0∑nj=0∑i(in)(ji)(−1)n−ifj
先枚举
j
j
j,再枚举
i
i
i,得到:
f
n
=
∑
j
=
0
n
∑
i
=
j
n
(
n
i
)
(
i
j
)
(
−
1
)
n
−
i
f
j
=
∑
j
=
0
n
f
j
∑
i
=
j
n
(
n
i
)
(
i
j
)
(
−
1
)
n
−
i
\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}
fn=j=0∑ni=j∑n(in)(ji)(−1)n−ifj=j=0∑nfji=j∑n(in)(ji)(−1)n−i
使用 「组合数性质 | 二项式推论」 的公式 (11) 得到:
$$
\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 k = i - j k=i−j。则 i = k + j i = k + j i=k+j,上式转换为:
f n = ∑ j = 0 n ( n j ) f j ∑ k = 0 n − j ( n − j k ) ( − 1 ) n − j − k 1 k f_n = \sum_{j = 0}^{n}\binom{n}{j}f_j\sum_{k = 0}^{n - j}\binom{n - j}{k} (-1)^{n-j-k}1^{k} fn=j=0∑n(jn)fjk=0∑n−j(kn−j)(−1)n−j−k1k
使用 「组合数性质 | 二项式推论」 的公式 (5) 得到:
f
n
=
∑
j
=
0
n
(
n
j
)
f
j
[
n
=
j
]
=
f
n
f_n = \sum_{j = 0}^{n}\binom{n}{j}f_j[n = j] = f_n
fn=j=0∑n(jn)fj[n=j]=fn
证毕。
The End
鸣谢:
- OI Wiki