一个蒟蒻小学生尝试学习高级排列组合

一个蒟蒻小学生尝试学习高级排列组合

呃呃呃呃呃呃,我不咋会写,如有不对的地方欢迎纠正


紧接上文我们已经了解了基础的排列组合,我们可以接着往下学习排列组合的变种了.

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={n1a1,n2a2,,nkak} 表示由 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,nmn) 只不过后者较为繁琐,因而不采用。

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={n1a1,n2a2,,nkak} 表示由 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} (k1r+k1)

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={n1a1,n2a2,,nkak,} 表示由 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], xini, i=1kxi=r

于是很自然地想到了容斥原理。容斥的模型如下:

  1. 全集: ∑ i = 1 k x i = r \displaystyle \sum_{i=1}^kx_i=r i=1kxi=r 的非负整数解。
  2. 属性: x i ≤ n i x_i\le n_i xini

于是设满足属性 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 xini+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=1kSi =U i=1kSi

根据容斥原理,有:
∣ ⋃ 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=1kSi ==i Si i,j SiSj +i,j,k SiSjSk +(1)k1 i=1kSi i(k1k+rni2)i,j(k1k+rninj3)+i,j,k(k1k+rninjnk4)+(1)k1(k1k+ri=1knik1)

拿全集 ∣ U ∣ = ( k + r − 1 k − 1 ) \displaystyle |U|=\binom{k+r-1}{k-1} U=(k1k+r1) 减去上式,得到多重集的组合数
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=0k(1)pA(k1k+r1AnAip)

其中 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=AnnQn=nAnn=(n1)!

由此可知部分圆排列的公式:
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×(nr)!n!

2-1.组合数性质 | 二项式推论

由于组合数在 OI 中十分重要,因此在此介绍一些组合数的性质。

( n m ) = ( n n − m ) (1) \binom{n}{m}=\binom{n}{n-m}\tag{1} (mn)=(nmn)(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(k1n1)(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)=(mn1)+(m1n1)(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=0n(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=0n(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=0m(in)(mim)=(mm+n)   (nm)(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=0n(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=0ni(in)=n2n1(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=0ni2(in)=n(n+1)2n2(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=0n(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)(rknk)(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=0n(ini)=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 i0 个元素形成特定结构的总方案数。

若已知 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=0n(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=0n(in)(1)nigi
上述已知 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=0n(in)(1)ni[j=0i(ji)fj]=i=0nj=0i(in)(ji)(1)nifj
先枚举 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=0ni=jn(in)(ji)(1)nifj=j=0nfji=jn(in)(ji)(1)ni
使用 「组合数性质 | 二项式推论」 的公式 (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=ij。则 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=0n(jn)fjk=0nj(knj)(1)njk1k

使用 「组合数性质 | 二项式推论」 的公式 (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=0n(jn)fj[n=j]=fn

证毕。

The End

鸣谢:

  • OI Wiki
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值