组合数公式

2022-09-08 09:09:38 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

排列组合:

排列推导:

[binom{n}{k} binom{n}{k-1}=binom{n 1}{k} ]

很好证明,将定义式子写出来后合并分数即可.

二项式定理:

[(a b)^n=sum_{i=0}^nbinom{n}{i}a^{n-i}b^i ]

证明可以利用上面的推导做归纳。

多重集的排列数

定义:

多重集是包含重复元素的广义集合。

而多重集的排列数又称为 多重组合数

性质:

设 (S={n_1cdot a_1,n_2cdot a_2,cdots,n_kcdot a_k,}),表示由 (n_1) 个 (a_1) …. (n_k) 个 (a_k) 组成的多重集,则 (S) 的全排列个数为:

[frac{n!}{prod_{i=1}^kn_i!}=frac{n!}{n_1!n_2!cdots n_k!} ]

相当于是把相同元素的排列数除掉了。

具体来说,有 (k) 种不一样的球,每种球的个数分别是 (n_1,n_2,….,n_k) ,且加和为 (n)。

这 (n) 个球的全排列数就是 多重集的排列数

多重集的组合数 (1):

设 (S={n_1cdot a_1,n_2cdot a_2,cdots,n_kcdot a_k,}),表示由 (n_1) 个 (a_1) …. (n_k) 个 (a_k) 组成的多重集。

那么对于整数 (r(r < n_i)) ,从 (S) 中选择 (r) 个元素组成一个多重集的方案数就是 多重集的组合数

这个问题等价于 :(x_1 x_2 … x_k=r) 的非整数解的数目,可以用插板法解决。答案为:

[binom{r k-1}{k-1} ]

证明:

因为在这种情况下, (x_{[1,k]}) 的数可能为 (0) ,我们把每一个 (x 1) ,得到了这个式子:

[x_1 x_2 … x_k=r k ]

代换意义就是用 (k-1) 个挡板,在 (k r-1) 个空隙,将 (k r) 个小球分成 (k) 部分。即以上式子。

多重集的组合数 (2):

设 (S={n_1cdot a_1,n_2cdot a_2,cdots,n_kcdot a_k,}),表示由 (n_1) 个 (a_1) …. (n_k) 个 (a_k) 组成的多重集。

对于正整数 (r(r < n)) , 求从 (S) 中选择 (r) 个元素组成一个多重集的方案数.

这样的话就限制了每种元素取的个数,把这个问题转化成带限制的线性方程:

[forall iin [1,k], x_ile n_i, sum_{i=1}^kx_i=r ]

我们利用容斥原理去解决,模型如下:

  1. 全集:(sum_{i=1}^k x_i=r) 的非负整数解
  2. 属性:(x_ileq n_i)

设 满足属性 (i) 的集合是 (S_i) ,(overline{S_i}) 表示不满足属性 (i) 的集合,即满足 (x_i geq n_i 1) 的集合,那么答案即为:

[left|bigcap_{i=1}^kS_iright|=|U|-left|bigcup_{i=1}^koverline{S_i}right| ]

根据容斥原理。。。。。 具体在 (OI-WIKI) 上都有。

用全集 (|U|=binom{r k-1}{k-1}) 减去上面式子,得到了多重集的组合数:

[Ans=sum_{p=0}^k(-1)^psum_{A}binom{k r-1-sum_{A} n_{A_i}-p}{k-1} ]

其中 (A) 是充当枚举子集的作用,满足 (|A|=p, A_i<A_{i 1}) 。

不相邻的排列:

定义:

([1,n]) 这 (n) 个自然数中选 (k) 个,这 (k) 个数中任何两个数都不相邻的组合有:

[binom{n-k 1}{k} ]

错排:

详情见我另外一篇博客:错排

圆排列:

定义:

(n) 个人全部来围成一圈,所有的排列数即为 (Q_n^n)

分析:

考虑其中已经排好的一圈,从不同位置断开,又变成不同的序列,所以有以下推导:

[Q_n^n times n= A_n^n rightarrow Q_n^n=frac{A_n^n}{n}=(n-1)! ]

从这里能推导出 (n) 个人其中 (m) 个围成一圈的方案数:

[mathrm Q_n^r = frac{mathrm A_n^r}{r} = frac{n!}{r times (n-r)!} ]

组合数性质:

1. 将选出的集合对全集取补集:

[binom{n}{m}=binom{n}{n-m}tag{1} ]

2. 递推式:

[binom{n}{k}=frac{n}{k}binom{n-1}{k-1} ]

3. 组合数递推式(和上方相同)

[binom{n}{m}=binom{n-1}{m} binom{n-1}{m-1} ]

然后一开始初始化是这样的:

代码语言:javascript复制
c[1][1]=1; for(int i=0;i<=n;i  ) c[i][0]=1;
for(int i=2;i<=n;i  )
    for(int j=1;j<=i;j  ){
        c[i][j]=c[i-1][j] c[i-1][j-1];
    }

这个式子是杨辉三角的公式表达。

4. 二项式定理特殊情况:

[binom{n}{0} binom{n}{1} cdots binom{n}{n}=sum_{i=0}^nbinom{n}{i}=2^ntag{4} ]

5. 二项式定理另一种情况:

[sum_{i=0}^n(-1)^ibinom{n}{i}=[n=0]tag{5} ]

6. 拆组合数:

[sum_{i=0}^mbinom{n}{i}binom{m}{m-i}=binom{m n}{m} (ngeq m) ]

当 (m=n) 的时候,则有式子:

[sum_{i=0}^n binom{n}{i}^2=binom{2n}{n} ]

剩下的看 OI-WIKI 好了.

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154644.html原文链接:https://javaforall.cn

0 人点赞