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