组合数公式

组合数公式排列组合:排列推导:\(\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 好了.

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 从零和使用mxnet实现softmax分类

    1.softmax从零实现(1797,64)(1797,)(1797,10)epoch:50,loss:[1.9941667],accuracy:0.3550361713967724

    2021年12月30日
  • MP4格式详解_mp4格式有哪些

    MP4格式详解_mp4格式有哪些一、mp4概述MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为containerbox。一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(MovieBox),它是一种containerbox,子box包含了媒体的metadata信息;MP4文

    2022年10月16日
  • java中使用uuid函数_uuid主键

    java中使用uuid函数_uuid主键UUID介绍:UUID(UniversallyUniqueIdentifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则…

  • C++和Java哪个比较好入门?初学者该如何选择?

    C++和Java哪个比较好入门?初学者该如何选择?选择好的方向比努力更重要,对于初学编程的人来说选择一门合适的编程语言关系到自己以后的职业发展。c++和Java那个更适合作为入门语言?给大家简单科普一下~C++语言它是正宗的C语言的嫡系,由C语言发展而来。C++支持多种编程范式–面向对象编程、泛型编程和过程化编程,支持类:类、封装、重载等特性。C++语言的主要特点表现在两个方面:尽量兼容C 支持面向对象的方法。它操持了C的简洁、高效的接近汇编语言等特点,对C的类型系统进行了改革的扩充,因此C++比C更安全,C++的编译系统.

  • linux怎么创建用户和用户组_linux查看用户组

    linux怎么创建用户和用户组_linux查看用户组1、linux里查看所有用户(1)在终端里.其实只需要查看/etc/passwd文件就行了.(2)看第三个参数:500以上的,就是后面建的用户了.其它则为系统的用户.或者用cat/etc/passwd|cut-f1-d:2、用户管理命令useradd注:添加用户adduser注:添加用户passwd注:为用户设置密码usermod注:修改用户命令,可以通过usermod来修…

    2022年10月21日
  • C++中截取字符串和识别字符位置

    C++中截取字符串和识别字符位置

发表回复

您的电子邮箱地址不会被公开。

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