组合数公式

组合数公式排列组合:排列推导:\(\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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux信号,signal和sigaction(一)[通俗易懂]

    Linux信号,signal和sigaction(一)[通俗易懂]
    信号是Unix和Linux系统响应某些条件而产生的一个事件。接收到该信号的进程会相应地采取一些操作。
    每个信号都有一个数字编码。
     
             实例:Ctrl-C的工作原理
            1.用户输入ctrl-c<

    2022年5月4日
  • 关于HTTP协议,一篇就够了「建议收藏」

    关于HTTP协议,一篇就够了「建议收藏」关于HTTP协议,一篇就够了HTTP简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速…

    2022年6月13日
  • 获取textview行数

    获取textview行数如果我们想获取TextView内容的行数,TextView没有提供现成的api供我们使用,需要我们自己获取。这里提供一个间接的方法,通过StaticLayout来间接获取行数。下面是代码:publicstaticintgetTextViewLines(TextViewtextView,inttextViewWidth){intwidth=textViewWidt…

    2022年10月29日
  • Docker离线安装教程「建议收藏」

    Docker离线安装教程「建议收藏」一、基础环境Centos7环境下载docker包,我们演示的是19.3.12下载地址将下载好的压缩包上传至服务器下二、开始安装解压docker包tar-zxvfdocker-19.03.12.tgz将解压后的文件复制到/usr/bin下cpdocker/*/usr/bin将docker注册为servicevi/etc/systemd/system/docker.service复制下列配置到docker.service并保存(:wq)[Un

    2022年9月26日
  • bootstrap-datepicker限定可选时间范围

    bootstrap-datepicker限定可选时间范围一、应用场景实际应用中可能会根据日期字段查询某个日期范围内的数据,则需要对日期选择器可选时间进行限制,如:开始时间不能大于结束时间,结束时间不能小于开始时间,此时就要为开始日期选择器和结束日期选择器动态的设置startDate和endDate的值。二、相关知识点1、bootstrap-datepicker的初始化引入bootstrap-datepicker.js和boot…

    2022年6月22日
  • mysql不执行命令_linux mysql启动命令

    mysql不执行命令_linux mysql启动命令Linux下使用mysql命令需要配置好环境以及各种文件,下面由学习啦小编为大家整理了linux下mysql命令不能用的相关知识,希望对大家有帮助!linux的mysql命令没用解决方法1.重新安装mysql命令,方法步骤如下:一安装步骤从这里下载你需要的版本(注意选择你操作系统是64位的还是32位的):这里只介绍两种判断linux是64位还是32的方法:命令:file/bin/cat[roo…

    2022年9月16日

发表回复

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

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