组合数公式

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


相关推荐

  • 使用PyTorch进行语义分割「建议收藏」

    使用PyTorch进行语义分割「建议收藏」本篇文章使用进行pytorch进行语义分割的实验。1.什么是语义分割?语义分割是一项图像分析任务,我们将图像中的每个像素分类为对应的类。这类似于我们人类在默认情况下一直在做的事情。每当我们看到某些画面时,我们都会尝试“分割”图像的哪一部分属于哪个类/标签/类别。从本质上讲,语义分割是我们可以在计算机中实现这一点的技术。您可以在我们关于图像分割的帖子中阅读更多关于分割的内容。这篇文章…

  • 类加载器的方法_JS加载器

    类加载器的方法_JS加载器packagecom.tech.load.def;/***@authorlw*@since2021/12/3*/publicclassUserImpl{static{System.out.println(“UserImplinit…”);}}packagecom.tech.load.def;/***@authorlw*@since2021/12/3*/publicclassDe..

  • 在线代理(Web ProxyServer)完全详解

    在线代理(Web ProxyServer)完全详解在线代理(WebProxy)原理可以简单的概述为:用户(A)-在线代理服务器(B)-目标网站(C),即:A向B发送浏览请求-B执行请求发送给C-C收到请求,回应。什么是在线代理  在线代理英文全称是(WebProxyServer),又称在线代理。代理服务器其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他

  • 多行注释快捷键_jsp注释快捷键

    多行注释快捷键_jsp注释快捷键1、Pycharm同时编辑多行:alt+shift+ctral+鼠标左键2、Pycharm同时多行注释:多行选中后ctrl+\

  • 输出最小值及所在数组下标_java数组最大值和下标

    输出最小值及所在数组下标_java数组最大值和下标packagepractice;importjava.util.Scanner;publicclassMaximumAndLowerMark{ publicstaticvoidmain(String[]args){ Scannersc=newScanner(System.in); intarr[]=newint[10]; for(inti=0;i<arr.length;i++){ System.out.print(

  • 一个不容错过的Spring Cloud实战项目!

    mall-swarm作为mall项目的SpringCloud版本,目前已更新至最新代码,新增了权限管理功能。mall项目中的代码将一直保持最新,mall-swarm每过一段时间将从ma…

发表回复

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

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