首页 > 其他分享 >一个蒟蒻小学生尝试学习高级排列组合

一个蒟蒻小学生尝试学习高级排列组合

时间:2024-08-06 22:28:05浏览次数:6  
标签:尝试 sum 多重集 overline cdots tag 排列组合 binom 小学生

一个蒟蒻小学生尝试学习高级排列组合

呃呃呃呃呃呃,我不咋会写,如有不对的地方欢迎纠正


紧接上文我们已经了解了基础的排列组合,我们可以接着往下学习排列组合的变种了.

1.排列组合的变种

1-1.多重集的排列数 + 多重组合数

大家一定要区分 多重组合数多重集的组合数!两者是完全不同的概念!

多重集是指包含重复元素的广义集合。设 $S={n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k}$ 表示由 $n_1$ 个 $a_1$,$n_2$ 个 $a_2$,…,$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,\cdots,n_k$,且 $n=n_1+n_2+\ldots+n_k$。这 $n$ 个球的全排列数就是 多重集的排列数。多重集的排列数常被称作 多重组合数。我们可以用多重组合数的符号表示上式:
$$
\binom{n}{n_1,n_2,\cdots,n_k}=\frac{n!}{\prod_{i=1}^kn_i!}
$$

可以看出,$\dbinom{n}{m}$ 等价于 ,$\dbinom{n}{m,n-m}$ 只不过后者较为繁琐,因而不采用。

1-2.多重集的组合数 1

设 $S={n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k}$ 表示由 $n_1$ 个 $a_1$,$n_2$ 个$a_2$,…,$n_k$ 个$a_k$ 组成的多重集。那么对于整数 $r(r<n_i,\forall i\in[1,k])$,从$S$ 中选择 $r$ 个元素组成一个多重集的方案数就是 多重集的组合数。这个问题等价于 $x_1+x_2+\cdots+x_k=r$ 的非负整数解的数目,可以用插板法解决,答案为

$$
\binom{r+k-1}{k-1}
$$

1-3.多重集的组合数 2

考虑这个问题:设 $S={n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,}$ 表示由 $n_1$ 个 $a_1$,$n_2$ 个 $a_2$,…,$n_k$ 个 组 $a_k$ 成的多重集。那么对于正整数 $r$,从 $S$ 中选择 $r$ 个元素组成一个多重集的方案数。

这样就限制了每种元素的取的个数。同样的,我们可以把这个问题转化为带限制的线性方程求解:
$$
\forall i\in [1,k],\ x_i\le n_i,\ \sum_{i=1}^kx_i=r
$$

于是很自然地想到了容斥原理。容斥的模型如下:

  1. 全集:$\displaystyle \sum_{i=1}^kx_i=r$ 的非负整数解。
  2. 属性:$x_i\le n_i$。

于是设满足属性 $i$ 的集合是 $S_i$,$\overline{S_i}$ 表示不满足属性 $i$ 的集合,即满足 $x_i\ge n_i+1$ 的集合(转化为上面插板法的问题三)。那么答案即为
$$
\left|\bigcap_{i=1}kS_i\right|=|U|-\left|\bigcup_{i=1}k\overline{S_i}\right|
$$

根据容斥原理,有:
$$
\begin{aligned} \left|\bigcup_{i=1}^k\overline{S_i}\right| =&\sum_i\left|\overline{S_i}\right| -\sum_{i,j}\left|\overline{S_i}\cap\overline{S_j}\right| +\sum_{i,j,k}\left|\overline{S_i}\cap\overline{S_j}\cap\overline{S_k}\right| -\cdots\ &+(-1){k-1}\left|\bigcap_{i=1}k\overline{S_i}\right|\ =&\sum_i\binom{k+r-n_i-2}{k-1} -\sum_{i,j}\binom{k+r-n_i-n_j-3}{k-1}+\sum_{i,j,k}\binom{k+r-n_i-n_j-n_k-4}{k-1} -\cdots\ &+(-1){k-1}\binom{k+r-\sum_{i=1}kn_i-k-1}{k-1} \end{aligned}
$$

拿全集 $\displaystyle |U|=\binom{k+r-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-4.圆排列

$n$ 个人全部来围成一圈,所有的排列数记为 $\mathrm Q_n^n$。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以有
$$
\mathrm Q_n^n \times n = \mathrm A_n^n \Longrightarrow \mathrm Q_n = \frac{\mathrm A_n^n}{n} = (n-1)!
$$

由此可知部分圆排列的公式:
$$
\mathrm Q_n^r = \frac{\mathrm A_n^r}{r} = \frac{n!}{r \times (n-r)!}
$$

2-1.组合数性质 | 二项式推论

由于组合数在 OI 中十分重要,因此在此介绍一些组合数的性质。

$$
\binom{n}{m}=\binom{n}{n-m}\tag{1}
$$
相当于将选出的集合对全集取补集,故数值不变。(对称性)

$$
\binom{n}{k} = \frac{n}{k} \binom{n-1}{k-1}\tag{2}
$$

由定义导出的递推式。
$$
\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}\tag{3}
$$
组合数的递推式(杨辉三角的公式表达)。我们可以利用这个式子,在 $O(n^2)$ 的复杂度下推导组合数。

$$
\binom{n}{0}+\binom{n}{1}+\cdots+\binom{n}{n}=\sum_{i=0}n\binom{n}{i}=2n\tag{4}
$$

这是二项式定理的特殊情况。取 $a=b=1$ 就得到上式。

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

二项式定理的另一种特殊情况,可取 $a=1, b=-1$。式子的特殊情况是取 $n=0$ 时答案为 $1$

$$
\sum_{i=0}^m \binom{n}{i}\binom{m}{m-i} = \binom{m+n}{m}\ \ \ (n \geq m)\tag{6}
$$

拆组合数的式子,在处理某些数据结构题时会用到。

$$
\sum_{i=0}n\binom{n}{i}2=\binom{2n}{n}\tag{7}
$$

这是 $6$ 的特殊情况,取 $n=m$ 即可。

$$
\sum_{i=0}ni\binom{n}{i}=n2\tag{8}
$$

带权和的一个式子,通过对 $3$ 对应的多项式函数求导可以得证。

$$
\sum_{i=0}ni2\binom{n}{i}=n(n+1)2^{n-2}\tag{9}
$$

与上式类似,可以通过对多项式函数求导证明。

$$
\sum_{l=0}^n\binom{l}{k} = \binom{n+1}{k+1}\tag{10}
$$

通过组合分析一一考虑 $S={a_1, a_2, \cdots, a_{n+1}}$ 的 $k+1$ 子集数可以得证,在恒等式证明中比较常用。

$$
\binom{n}{r}\binom{r}{k} = \binom{n}{k}\binom{n-k}{r-k}\tag{11}
$$

通过定义可以证明。

$$
\sum_{i=0}^n\binom{n-i}{i}=F_{n+1}\tag{12}
$$

其中 $F$ 是斐波那契数列。

2-2.二项式反演

记 $ f_n$ 表示恰好使用 $n$ 个不同元素形成特定结构的方案数,$g_n$ 表示从 $n$ 个不同元素中选出 $i \geq 0$ 个元素形成特定结构的总方案数。

若已知 $f_n$ 求 $g_n$,那么显然有:

$$
g_n = \sum_{i = 0}^{n} \binom{n}{i} f_i
$$
若已知 $g_n$ 求 $f_n$,那么:

$$
f_n = \sum_{i = 0}^{n} \binom{n}{i} (-1)^{n-i} g_i
$$
上述已知 $g_n$ 求 $f_n$ 的过程,就称为 二项式反演。

证明

将反演公式的 $g_i$ 展开得到:

$$
\begin{aligned}
f_n &= \sum_{i = 0}^{n} \binom{n}{i} (-1)^{n-i} \left[\sum_{j = 0}^{i} \binom{i}{j} f_j\right] \
&= \sum_{i = 0}^{n}\sum_{j = 0}^{i}\binom{n}{i}\binom{i}{j} (-1)^{n-i}f_j
\end{aligned}
$$
先枚举 $j$,再枚举 $i$,得到:

$$
\begin{aligned}
f_n &= \sum_{j = 0}^{n}\sum_{i = j}^{n}\binom{n}{i}\binom{i}{j} (-1)^{n-i}f_j \
&= \sum_{j = 0}^{n}f_j\sum_{i = j}^{n}\binom{n}{i}\binom{i}{j} (-1)^{n-i}
\end{aligned}
$$
使用 「组合数性质 | 二项式推论」 的公式 (11) 得到:

$$
\begin{aligned}
f_n &= \sum_{j = 0}^{n}f_j\sum_{i = j}^{n}\binom{n}{j}\binom{n - j}{i - j} (-1)^{n-i} \
&= \sum_{j = 0}^{n}\binom{n}{j}f_j\sum_{i = j}^{n}\binom{n - j}{i - j} (-1)^{n-i}
\end{aligned}

$$

令 $k = i - j$。则 $i = k + j$,上式转换为:

$$
f_n = \sum_{j = 0}^{n}\binom{n}{j}f_j\sum_{k = 0}^{n - j}\binom{n - j}{k} (-1){n-j-k}1
$$

使用 「组合数性质 | 二项式推论」 的公式 (5) 得到:
$$
f_n = \sum_{j = 0}^{n}\binom{n}{j}f_j[n = j] = f_n
$$

证毕。

The End

鸣谢:

  • OI Wiki

标签:尝试,sum,多重集,overline,cdots,tag,排列组合,binom,小学生
From: https://www.cnblogs.com/zzy-hhh/p/18346104

相关文章

  • 笔记——排列组合
    蓝月の笔记——排列组合篇摘要万恶的数学!Part1加乘原理小学奥数内容加法原理:当多个方案并列(即互不影响)时,总方案数为各个方案数之和例:共有\(k\)种交通工具可以从A地到B地,第\(i\)种交通工具有\(a_i\)班次,那么从A地到B地的总方案数为\(\sum_{1\lei\lek}a_i\)乘......
  • 可用于机器学习的排列组合枚举算法含passcal - c shap-c源码
    可用于机器学习的排列组合枚举算法含passcal-cshap-c源码1机器学习和数据挖掘• 特征选择:在机器学习中,需要从多个特征中选择最有价值的组合。通过枚举不同的特征组合,可以找到最佳的特征集合。• 超参数优化:在训练模型时,需要调整多个超参数。通过枚举不同的超参数组......
  • 没有用的尝试:复制某一文件夹里所有大于100kb的文件到另一个文件夹内,并统一修改它们的
    #python批量更换后缀名importosimportshutil#需要修改后缀的文件目录folder_path=input('要整理的文件夹:')path:str=input('接受整理文件的文件夹:')suffix=input('要更改的后缀名:')ifnotos.path.exists(path):os.makedirs(path)else:passos.chm......
  • 尝试从函数内部更改值,但退出函数时它不会改变
    尝试制作一个准系统的Pokemon游戏并且切换不起作用当尝试切换Pokemon时,我可以让代码识别activePlayerMon=在运行switchOption()函数时有一个值切换,但是一旦调试器离开该函数,它就会恢复当第一次提示您选择Mon时,返回到最初给定的值deffight(playerlist,computerl......
  • 当尝试执行Web应用程序时,会发生这样的错误
    ValueError:pickle中的节点数组具有不兼容的dtype:预期:{'names':['left_child','right_child','feature','threshold','impurity','n_node_samples','weighted_n_node_samples','......
  • 尝试使用Python抓取需要先登录的网站但没有成功
    我正在尝试抓取一个需要登录的网站(我的路由器GUI),但无论我做了什么,我都会反复返回登录站点的源代码,而不是成功登录后出现的页面。我做了一些阅读,并意识到我需要返回POST请求的答案。我想我找到了它们并返回了所需的值,但仍然-似乎没有任何效果。我使用https://curl.tri......
  • 我正在尝试使用 Streamlit 应用程序在 s3 上上传文件,但收到错误文件名必须是路径
    我尝试打印路径并发现Streamlit暂时存储文件,但我无法获取路径临时文件已存储我无法获取文件的路径。我什至尝试打印它,但是没有路径。我之前尝试通过指定文件路径来上传本地机器并且代码运行良好importstreamlitasstimportrequestsfromdotenvimportlo......
  • 尝试让 BeautifulSoup 打印来自雅虎财经的名字的 URL 列表
    目标是让Python/BeautifulSoup抓取雅虎财经和上市公司所有者的名字/姓氏:frombs4importBeautifulSoupimportrequestsurl='https://finance.yahoo.com/quote/GTVI/profile?p=GTVI'page=requests.get(url,headers={"User-Agent":"Mozil......
  • WebApi连接数据库报错:尝试加载Oracle客户端时引发BadImageFormatException
    出现的问题  今天在公司用C#搭建一个WebApi服务,接受请求并连接数据库进行查询,但连接数据库时报错:尝试加载Oracle客户端时引发BadImageFormatException。如果安装32位客户端组件的情况下以64位模式运行,将出现此问题。问题点  我之后了解点,确定了OracleClient客户端确实安装......
  • 尝试导入“cuml”库时出现导入错误
    摘要:尝试在Ubuntu24.04上的conda环境中导入cuml库时遇到导入错误。以下是我遵循的步骤以及遇到的错误。重现步骤:创建新的conda环境:condacreate--prefix./envjupyterpython=3.8从rapidsai通......