组合数公式

组合数公式排列组合:排列推导:\(\binom{n}{k}+\binom{n}{k-1}=\binom{n+1}{k}\)很好证明,将定义式子写出来后合并分数即可.二项式定理:\((a+b)^n=\s

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

排列组合:

排列推导:

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

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

二项式定理:

\[(a+b)^n=\sum_{i=0}^n\binom{n}{i}a^{n-i}b^i \]

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

多重集的排列数

定义:

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

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

性质:

\(S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot 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_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot 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_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\}\),表示由 \(n_1\)\(a_1\) …. \(n_k\)\(a_k\) 组成的多重集。

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

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

\[\forall i\in [1,k],\ x_i\le n_i,\ \sum_{i=1}^kx_i=r \]

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

  1. 全集:\(\sum_{i=1}^k x_i=r\) 的非负整数解

  2. 属性:\(x_i\leq n_i\)

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

\[\left|\bigcap_{i=1}^kS_i\right|=|U|-\left|\bigcup_{i=1}^k\overline{S_i}\right| \]

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

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

\[Ans=\sum_{p=0}^k(-1)^p\sum_{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} \]

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

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}^n\binom{n}{i}=2^n\tag{4} \]

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

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

6. 拆组合数:

\[\sum_{i=0}^m\binom{n}{i}\binom{m}{m-i}=\binom{m+n}{m} (n\geq m) \]

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

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

剩下的看 OI-WIKI 好了.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 走进云时代_怎么跟上时代的脚步

    走进云时代_怎么跟上时代的脚步如何跟上时代的步伐进入云世界

    2022年4月21日
    47
  • Linux移植的一般过程

    前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程。一开始的UBOOT的移植不多说了。UBOOT最后有两种方式进入Linux,一种是使用uImage,

    2021年12月26日
    250
  • jquery插件treetable 动态加载问题

    jquery插件treetable 动态加载问题使用jquery插件treetable增加后刷新table时,树形样式丢失在增加或修改后,动态加载html,开始就直接使用$(“#treeTabletbody”).empty().append(data);这个用法是错误的,后来换成//成功后刷新表格 $(“#treeTabletbody”).empty();varhtml=data.htmlTable;…

    2022年5月27日
    131
  • Java ListNode 链表

    JavaListNode链表基本结构基本初始化添加构造方法初始化范型写法创建与遍历链表插入节点替换节点删除节点补充说明基本结构链表是一种数据结构,由数据和指针构成,JavaListNode链表是一种由Java自定义实现的链表结构。基本初始化classListNode{//类名:Java类就是一种自定义的数据结构intval;//数据:节点数据ListNodenext;//对象:引用下一个节点对象。在Jav

    2022年4月8日
    253
  • 世界各国B2B网站大全「建议收藏」

    世界各国B2B网站大全「建议收藏」世界各国B2B网站大全、全球各国B2B网站大全、全球B2B网站大全世界各国B2B网站全球外贸B2B网站大全AlibabacantonfairAliexpressTradetangBeltalhktdcDiytradeli

    2022年6月29日
    46
  • VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)”[通俗易懂]

    VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)”[通俗易懂]前言上一篇文章中,为了编译OpenCV的示例代码,然后搭建环境,最后想直接运行示例demo,我在创建新工程的时候,直接创建了一个win32窗口项目,然后环境配置完成后,将opencv的示例代码kalman.cpp直接导入到新建的vs工程中进行编译,直接报错:错误 LNK2019 无法解析的外部符号_WinMain@16,该符号在函数"int__cdeclinvoke_main(vo…

    2022年10月6日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号