首页 > 其他分享 >组合数学总结

组合数学总结

时间:2024-08-23 16:26:16浏览次数:8  
标签:总结 组合 int sum boldsymbol tag 数学 binom inv

数学是毒瘤


组合数学总结。

如果说数论是数学的基础,那么组合数学往后就是高阶了。这之后的数学不再像数论那么板子,而是变得需要更多的推理和组合了。知识很简单,难的是应用。

本来还有什么容斥原理,看不懂,于是没放


初始化

为了方便快速求排列组合,我们需提前预处理阶乘和阶乘的乘法逆元。

令 \(\textit{fac}[i]\) 表示 \(i\) 的阶乘,\(\textit{inv}[i]\) 表示 \(\boldsymbol i\) 的阶乘 的乘法逆元。

\(\textit{inv}[i]\) 是 \(\boldsymbol i\) 的阶乘 的乘法逆元,不是 \(i\) 的乘法逆元!

2024/3/17 upd.

注意:若 \(\boldsymbol n\) 的规模超过 \(\boldsymbol{10^6}\) 级别,请勿预处理 \(\boldsymbol{\boldsymbol{inv}[i]}\),而是即时计算!

注意:若 \(\boldsymbol n\) 的规模超过 \(\boldsymbol{10^7}\) 级别,请线性求逆元!公式:\(\boldsymbol{\boldsymbol{inv}[i]=\boldsymbol{inv}[i+1]\times(i+1)~\mathbf{mod~MOD}}\)。——2024/5/19 upd.

void init() {
	fac[0] = inv[0] = 1;
	for (int i = 1; i < MAXN; i++) {
		fac[i] = fac[i - 1] * i % MOD;
		inv[i] = power(fac[i], MOD - 2, MOD);
	}
}

一般情况下,数论题都有一个 \(\mathrm{MOD}\) 值,否则可以传参 \(p\) 表示模数。

排列数 \(\boldsymbol{\mathbf A_n^m}\)

排列数的计算公式如下:

\[\mathrm A_n^m=\frac{n!}{(n-m)!} \]

inline int A(int n, int m, int p) {
	if (n < m) return 0;
	return fac[n] * inv[n - m] % p;
}

组合数 \(\boldsymbol{\dbinom nm}\)

组合数的计算公式如下:

\[\binom nm=\frac{n!}{m!(n-m)!} \]

inline int C(int n, int m, int p) {
	if (n < m) return 0;
	return fac[n] * inv[m] % p * inv[n - m] % p;
}

排列数和组合数都只需 \(O(n)\) 的预处理便可 \(O(1)\) 查询。

若需要即时求组合数,可以根据公式直接记忆化搜索:

int C(int n, int m) {
	if (m == 0 || m == n) return 1;
	if (cc[n][m] != 0) return cc[n][m];
	return cc[n][m] = C(n - 1, m) + C(n - 1, m - 1);
}

组合数性质

\[\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}=2^n\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^{n-1}\tag{8} \]

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

\[\sum_{i=0}^ni^2\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} \]

Lucas 定理

当 \(n,m\) 过大、超出数组的范围时,我们需要用 Lucas 定理求组合数。模数必须为质数。即对于质数 \(p\),有:

\[{n\choose m}\bmod p={n\bmod p\choose m\bmod p}{\left\lfloor n/p \right\rfloor\choose\left\lfloor m/p \right\rfloor}\bmod p \]

易知,\({n\bmod p\choose m\bmod p}\) 的 \(n,m\) 范围一定小于等于 \(p\),可以直接求解;\({\left\lfloor n/p \right\rfloor\choose\left\lfloor m/p \right\rfloor}\) 可以继续递归求解。当 \(m=0\) 时,返回 \(1\),递归结束。

int lucas(int n, int m, int p) {
	if (m == 0) return 1;
	return C(n % p, m % p, p) * lucas(n / p, m / p, p) % p;
}

二项式反演

二项式反演用于解决“某个物品恰好若干个”这类计数问题。

直接摆公式。证明需要用到前文提到的组合数定理。

形式 1

\(f_n\) 表示恰好 \(n\) 个的方案数量,\(g_n\) 表示至多 \(n\) 个的方案数量,则:

\[g_n=\sum_{i=0}^n{n\choose i}f_i\iff f_n=\sum_{i=0}^n\left(-1\right)^{n-i}{n\choose i}g_i \]

形式 2

\(f_k\) 表示恰好 \(k\) 个的方案数量,\(g_k\) 表示至少 \(k\) 个的方案数量,则:

\[g_k=\sum_{i=k}^n{i\choose k}f_i\iff f_k=\sum_{i=k}^n\left(-1\right)^{i-k}{i\choose k}g_i \]

错排问题

\[D_n=(n-1)(D_{n-1}+D_{n-2}) \]

标签:总结,组合,int,sum,boldsymbol,tag,数学,binom,inv
From: https://www.cnblogs.com/laoshan-plus/p/18376345

相关文章

  • 从龟速乘到 $Miller-Rabin$ 算法(数论算法总结)
    发现自己竟然菜到不太会龟速乘,所以把\(Miller-Rabin\)算法所需要用到的算法全学了一遍……龟速乘龟速乘是一种\(O(\logn)\)的乘法计算方法。考虑有时普通乘法取模会爆\(long\long\),因此我们考虑用类似快速幂的方式进行乘法运算。intmul(intx,inty,intc){ x%=c,y%=......
  • Day06_0.1基础学习MATLAB学习小技巧总结(6)——矩阵运算篇
    利用暑假的时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移......
  • 卡特兰数、Prufer 序列、BSGS 总结
    卡特兰数定义给定\(n\)个\(0\)和\(n\)个\(1\),它们构成一个长度为\(2n\)的排列,满足任意前缀中\(0\)的个数都不少于\(1\)的个数的序列的数量为卡特兰数列。显然\(H_0=H_1=1\)。(\(H\)为卡特兰数列)通项公式:\[H_n=\frac{\dbinom{2n}{n}}{n+1}\quad(n\ge2,n\in\math......
  • 【数据结构】总结二叉树的概念以及存储结构
    目录1.树的概念及结构1.1树的名词定义1.2树的表示2.二叉树的概念及结构 2.1二叉树的概念2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树2.3 二叉树的存储结构2.3.1顺序存储2.3.2链式存储3.选择题1.树的概念及结构1.1树的名词定义1.节点的度:......
  • C++:虚函数和虚表详细总结
    一、虚函数(VirtualFunctions)1.定义虚函数是基类中使用virtual关键字声明的成员函数,支持动态多态性。通过基类指针或引用调用虚函数时,会根据实际对象类型选择调用相应的函数实现。2.声明和定义虚函数的声明:classBase{public:virtualvoidshow();//......
  • 组合数学
    梦回选修\(2\)QAQ。这东西说实话的确考察思维,而且容易和dp什么的综合起来难度就直接飙到\(*3000\),但是组合数学的确是一个极其重要的部分,它可以在很多情况下帮你减少枚举次数(比如去年T2的哈希做法如果最后直接组合数学统计答案的话码量少了整整\(30\)行!),所以这也是以后的......
  • 概率和期望总结
    数学是毒瘤概率与期望总结。看这玩意就跟看扩展欧几里得、看矩阵乘法、看组合数学差不多,甚至比那些还难一个档次,因为它还跟DP搞在一起,美其名曰:概率DP和期望DP。概率定义某个随机试验的某种可能结果称为样本点所有样本点构成的集合称为样本空间到这里很好理解,例......
  • 2024.8.23 模拟赛总结
    A.distStatement:给定一棵\(n(n\le10^6)\)个节点带边权的树,定义\(\mathrm{Min}(x,y)\)是\((x,y)\)路径上的边权最小值。求\(\max_{r=1}^n{\sum_{v\nei}\mathrm{Min}(r,v)}\)。Solution:经典套路题。首先注意到一条路径上的只有最小值才会产生贡献,于是对于......
  • 047、Vue3+TypeScript基础,pinia库store的组合式写法
    01、main.js代码如下:<template><divclass="app"><h2class="title">App.Vue</h2><!--<Page1/>--><br><Page2/></div></template><scriptlang="ts......
  • 斯特林数学习笔记
    定义第二类斯特林数\(n\bracem\)表示\(n\)个两两不同的元素划分为\(m\)个互不区分的非空子集的方案数;第一类斯特林数\(n\brackm\)表示\(n\)个两两不同的元素划分为\(m\)个互不区分的非空轮换(可以理解为环)的方案数。第二类斯特林数的递推式:\({n\bracem}={n-1\bra......