组合数学

组合数学

组合数定义式

\(\binom{n}{m}=\frac{n!}{m!(n - m)!}\),表示 \(n\) 个数中选 \(m\) 个。

下降幂

\(n^{\underline{m}}=n(n - 1)(n - 2)\cdots(n - m + 1)\)

上升幂

\(n^{\overline{m}}=n(n + 1)(n + 2)\cdots(n + m - 1)\)

相关结论

  1. \(n^{\overline{m}}=(n + m - 1)^{\underline{m}}\),用于处理上升幂
  2. \(n^{\underline{m}}=(-1)^{m}(m - n - 1)^{\underline{m}}\),用于处理 \(n < 0\) 情况
  3. \(x^{\underline{n}}=(-1)^{n}(-x)^{\overline{n}}\),用于上升下降幂的转换
  4. \(\binom{n}{m}=\frac{n^{\underline{m}}}{m!}\)

特殊情况

  • \(0^{0}=0!=x^{0}=1\)
  • \(m>n\)\(m<0\) 时,\(\binom{n}{m}=0\)
  • \(m = 0\)\(m=n\) 时,\(\binom{n}{0}=\binom{n}{n}=1\)

各种定理

1. 递推式(春游)

\(\binom{n}{k}=\binom{n - 1}{k}+\binom{n - 1}{k - 1}\)

初值:\(\binom i0 = 1, n从0到i\)

2. 翻转

\(\binom{n}{k}=\binom{n}{n - k}\),条件:\(n>0\)

3. 吸收公式(用于处理常数或参数)

  • \(k\binom{n}{k}=n\binom{n - 1}{k - 1}\),用组合数定义展开证明
  • \(\frac{1}{n}\binom{n}{k}=\frac{1}{k}\binom{n - 1}{k - 1}\)
  • \((n - k)\binom{n}{k}=n\binom{n - 1}{k}\),用“春游”证明.
  • \(\sum_{i=0}^{n} i^{{\underline{m}}}\binom{n}{i}=\sum_{i=0}^{n} n^{\underline{m}}\binom{n-m}{i-m}=n^{{\underline{m}}} 2^{n-m}\),用很多次吸收公式的推论。

4. 上指标反转

\(\binom{n}{k}=(-1)^{k}\binom{k - n - 1}{k}\),用下降幂性质证

5. 二项式定理

  • \((x + y)^{n}=\sum_{k = 0}^{n}\binom{n}{k}x^{k}y^{n - k}\)
  • \(n\in\mathbb{R}\)\(|x|<|y|\) 时,\((x + y)^{n}=\sum_{k = 0}^{+\infty}\binom{n}{k}x^{k}y^{n - k}\)(泰勒展开可证明)
  • 常用:
    • \((x + 1)^{n}=\sum_{k = 0}^{n}\binom{n}{k}x^{k}\)
    • \((x - 1)^{n}=\sum_{k = 0}^{n}(-1)^{n - k}\binom{n}{k}x^{k}\)
    • \(\binom{n}{k}\)\((x + 1)^{n}\)\(x^k\)项系数。这可以用来证明其他定理。(如 Lucas)

6. 一行之和定理

  • \(\sum_{k = 0}^{n}\binom{n}{k}=2^{n}\),是二项式定理中 \(x = y = 1\) 的情况.

7. 平行求和

\(\sum_{k = 0}^{m}\binom{n + k}{k}=\binom{n + m + 1}{m}\),右边用“春游”展开可证.

8. 上指标求和

\(\sum_{k = 0}^{n}\binom{k}{m}=\binom{n + 1}{m + 1}\),用“春游”展开

9.

\(\sum_{k = 0}^{m}(-1)^{k}\binom{n}{k}=(-1)^{m}\binom{n - 1}{m}\)

10. 卷积

  • \(\sum_{k}\binom{r}{k}\binom{s}{n - k}=\binom{r + s}{n}\),从 \(r + s\) 个元素中选 \(n\) 个,等于从 \(r\) 中选 \(k\) 个,从 \(s\) 中选 \(n - k\) 个,\(k\in(0,n)\).
  • 该式用于处理大部分的 \(\sum\)
  • 变型:\(\sum_{k}\binom{l-k}{m}\binom{s}{k-n}(-1)^{k}=(-1)^{m + l}\binom{s-m-1}{l-m - n}\).

11.

\(\binom{r}{m}\binom{m}{k}=\binom{r}{k}\binom{r - k}{m - k}\)

  • 用定义展开证明
  • 组合意义:从 \(r\) 中选 \(m\) 个,再从这 \(m\) 个中选 \(k\) 个,等价于先选 \(k\) 个要用的,再从 \(r - k\) 个中选 \(m - k\) 个陪衬的。

多项式系数

  • \(n\) 个不同的物品分成 \(m\) 组,第 \(i\) 组有 \(a_{i}\) 个,总方案数:\(\frac{n!}{\prod_{i = 1}^{m}a_{i}!}\)\(\sum_{i = 1}^{m}a_{i}=n\)),可写作:\(\binom{n}{a_{1},a_{2},\cdots,a_{m}}\)
  • \(\binom{n}{a_{1},a_{2},\cdots,a_{m}}=\prod_{k = 1}^{m - 1}\binom{\sum_{i = k}^{m}a_{i}}{\sum_{i=k+1}^{m}a_{i}}\).

[注:上文是用AI把笔记的照片转文字的来的,可能会有错]

取模意义下的组合数

一些引理

  1. \(\binom{p}{n} \bmod p = [n = 0 \vee n = p]\)

    证明:\(\binom{p}{n}=\frac{p!}{n!(p - n)!}\),因为分子只有一个p,分母只有在n=p或n=0时有p。

  2. \[\begin{align} (a + b)^p &\equiv a^p + b^p \pmod{p}\\ 证明 :(a + b)^p &\equiv \sum_{n = 0}^{p} \binom{p}{n} a^{n}b^{p - n} \pmod{p}(二项式定理)\\ &\equiv a^p + b^p \pmod{p}(引理一) \end{align} \]

Lucas定理

一般来说,我们预处理阶乘,然后用定义式来计算组合数,但是当遇到 n 和 m 很大的时候,不支持\(O(n)\)的复杂度时,就要用到Lucas定理。

对于质数 \(p\),

\[\binom{n}{m} \bmod p = \binom{\lfloor n/p \rfloor}{\lfloor m/p \rfloor} \cdot \binom{n \bmod p}{m \bmod p} \bmod p \]

证明:
$\binom{n}{m} $ 是 \((x + 1)^n\)\(x^m\) 项系数。

\[(x + 1)^n mod\ p = (x + 1)^{p\left \lfloor n/p \right \rfloor }(x + 1)^{n\ mod\ p} mod\ p\ \\ (通过引理二) = (x^p + 1)^{\left \lfloor n/p \right \rfloor }(x + 1)^{n\ mod\ p} mod\ p\ 的x^m项系数\\ \because m = \left \lfloor m/p \right \rfloor p + m \bmod p\\ \therefore \binom{n}{m} = \binom{\lfloor n/p \rfloor}{\lfloor m/p \rfloor} \cdot \binom{n \bmod p}{m \bmod p} mod\ p \]

拓展 Lucas

用于处理模数M不是质数的情况。

\[M = p_1^{\alpha_1}\cdots p_m^{\alpha_m} \]

我们可以求出每一个 \(\binom{n}{m} \bmod p^{\alpha_i}\),然后CRT合并就行

我们把 n!,m!和\((n-m)!\)中,所有 p 的因子提出来,

会有形如 \(\frac{\frac{n!}{p^{x}}}{\frac{m!}{p^{y}}\frac{(n - m)!}{p^{z}}}p^{x - y - z}\bmod p^{\alpha}\)的式子。

分母可以 exgcd 求逆,我们只需要求形如下面这样的式子:

\[\frac{n!}{p^{x}}\bmod p^{\alpha} \]

\[n!=p^{\lfloor \frac{n}{p}\rfloor}\cdot\left(\left\lfloor \frac{n}{p}\right\rfloor\right)!\cdot\left(\prod_{i,\gcd(i,p)=1}^{p^{\alpha}}i\right)^{\lfloor \frac{n}{p^{\alpha}}\rfloor}\cdot\left(\prod_{i,\gcd(i,p)=1}^{n\bmod p^{\alpha}}i\right) \]

前面两个是 n 中 p 的倍数,第三个是 n 对 p 的循环节,最后一个是 n 对 p 的余数。

因为要求的是 n! 扣掉 p 的因子对 \(p^\alpha\) 取模,所以把\(p^{\lfloor \frac{n}{p}\rfloor}\)直接扔掉,然后继续递归求解\(\left(\left\lfloor \frac{n}{p}\right\rfloor\right)!\)

感觉这玩意非常难写,而且好像用处不大。

经典题型

一,插板法:

type 1: 有n个元素,m个板子。现在要求每两个板子之间至少有一个球,求方案数。

n个球有n-1个空位(认为头尾不放板)。于是答案是\(\binom {n-1}{m}\)

type 2:板之间可以不放球。

对于每一种方案,在相邻两个板之间再放一个球。这个与n+m个球的 type 1 等价。

所以答案是 \(\binom {n+m-1}{m}\).

练习题:从 1, 2, · · · , n 中选出 k 个数,要求任何两个数都不相邻,一共有多少种选法?

分成k+1段,设每一段长度为\(a_i\),将\(a_1和a_n\)的长度加1。

\(\sum a_i = n-k+2\)\(\forall a_i > 0\)

所以相当于在n-k+2个数插k个板

所以答案是 \(\binom{n-k+1}{k}\)

二,把组合数用二项式的 \(x^n\) 项系数理解

例题链接 解法 循环卷积

给定 \(n, p, r, k\ (1\leq n\leq 10^{9}, 0\leq r < k\leq 50, 2\leq p\leq 2^{30}-1)\),求

\[\sum_{i\bmod k = r} \binom{nk}{i} \bmod p \]

\[\begin{align*} &\sum_{i\bmod k = r} \binom{nk}{i}\\ =&\sum_{i\bmod k = r} [x^{i}](1 + x)^{nk}\\ =&[x^{r}]\left((1 + x)^{nk}\bmod (x^{k}-1)\right) \end{align*} \]

直接循环卷积快速幂,时间复杂度 \(O(k^{2}(\log n+\log k))\)

三,下指标求和的处理方法

我们发现下指标求和没有公式,所以我们要想办法转换下指标求和。

来看一个例题

题面

给定 \(n,m\),一共 \(T\) 组询问,求 \(\sum\limits_{k = 0}^m \binom nk \bmod{2333}\)

\(n,m\)\(10^9\) 级别,\(T\)\(10^5\) 级别。

解法:

先把 \(k\) 按照 \(\left\lfloor\frac kp \right\rfloor\) 分类

\[\sum_{k = 0}^m \binom nk = \sum_{i = 0}^{\lfloor \frac mp \rfloor - 1} \sum_{j = 0}^{p - 1} \binom{n}{ip + j} + \sum_{k = p\lfloor \frac mp\rfloor}^m \binom nk \]

再用 Lucas 定理展开:

\[\sum_{i = 0}^{\lfloor \frac mp \rfloor - 1} \binom{\lfloor \frac np\rfloor}{i} \sum_{j = 0}^{p - 1} \binom{n \bmod p}{j} + \sum_{k = p\lfloor \frac mp\rfloor}^m \binom{\frac np}{\frac kp}\binom{n \bmod p}{k \bmod p} \]

注意到 \(\sum\limits_{j = 0}^{p - 1} \binom{n \bmod p}{j}\) 用一行之和定理表示为 \(2^{n \bmod p}\)\(\binom{\frac np}{\frac kp}\) 始终为定值,而且可以用普通的 Lucas 来求,于是上式可改写为:

\[2^{n \bmod p} \sum_{i = 0}^{\lfloor \frac mp \rfloor - 1} \binom{\lfloor \frac np \rfloor}{i} + \binom{\frac np}{\frac kp} \sum_{k = 0}^{m \bmod p} \binom{n \bmod p}{k} \]

然后发现左边可以递归,右边 Lucas + 预处理。于是做完了。复杂度为 \(O(T log^2_p n)\)

总结一下

\(p\) 很小的时候,下指标求和可以用 Lucas 定理递归求解。

\(n \le m\) 的时候,可以用一行之和来求。

附上代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const int mod = 2333; 
ll n, m;
ll C[mod + 1][mod + 1], f[mod + 1][mod + 1];
ll lucas(int n, int m) {
	if(n < m) return 0;
	if(!m || n == m) return 1;
	return lucas(n / mod, m / mod) * C[n % mod][m % mod] % mod;
}
ll two[mod + 1];
ll calc(int n, int m) {
	if(m < 0) return 0;
	if(!n || !m) return 1; 
	if(n < mod && m < mod) return f[n][m];
	ll tmp = m / mod;
	return (f[n%mod][mod-1] * calc(n / mod, tmp - 1) % mod + lucas(n / mod, tmp) * f[n % mod][m % mod] % mod) % mod;
} 

void st(int n) {
	two[0] = 1; for(int i = 1; i <= n; ++i) two[i] = (two[i-1] << 1) % mod;
	C[0][0] = f[0][0] = 1;
	for(int j = 0; j <= n; ++j) f[0][j] = 1;
	for(int i = 1; i <= n; ++i) {
		C[i][0] = f[i][0] = 1;
		for(int j = 1; j <= i; ++j) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
		for(int j = 1; j <= n; ++j) f[i][j] = (f[i][j - 1] + C[i][j]) % mod;
	}
}
signed main() {
	st(mod);
	int _; cin >> _;
	while(_--) {
		cin >> n >> m;
		printf("%lld\n", calc(n, m));
	}
	return 0;
}//98 2 10

四,用组合意义

例题(某联考题):

\[\sum_{i=0}^{n} i^{\overline{m}}\binom{n}{i} \bmod\ p \]

n 是1e9, m 是1e6,p是1e9+7

有一种用斯特林数把上升幂转普通幂转下降幂,然后用斯特林数奇妙公式乱搞的做法,但是用组合意义做会有奇效。

简单转换一下式子:(把上升幂转组合数形式)

\[m!\sum_{i = 0}^{n}\binom{i + m-1}{m}\binom{n}{i} \]

先不看 m! , 我们可以认为是 :从 n 个球中选 i 个球,再往 i 个球中加 m - 1 个球,最后从i - 1 + m 个球选m个球。

现在每个球有三种状态:一. 两次都没被选中,记作 00, 二. 第一次被选中,第二次没被选中,记作 10, 三.两次都被中,记作 11.(我们认为追加的 m - 1 个球也是在第一次被选中的)

因为我们 \(\sum\) 的枚举范围只能是 O(m) 的,所以考虑转换组合意义。

11 的总数是 m ,枚举 i,表示有 i 个是从追加的 m - 1 个球中选来的,那么就还要从最初的 n 个球中选 m - i 个出来作为 11。原来的 n 个球就剩下了 n - m + i 个,对于这些球,我们可以把它们分配到 10,也可以分配到 00,这是没有限制的,所以是 \(2^{n-m+i}\).

所以答案是:

\[m!\sum^{m-1}_{i=0}{m-1\choose i}{n\choose m-i}2^{n-m+i} \]

还有一种更简单的理解方法:在 n 个盒子里选择 i 个,在这 i 个盒子里插 m 个相同的球,可以有空盒子的方案数。

改为枚举放了球的盒子数量 (认为只有这 i 个盒子放了球,其他盒子不放球) ,其它盒子任意选/不选(就算不放球也可以被选中),在这 i 个盒子里放 m 个球,要求盒子非空,这又是一个插板法,小推一下是 \(m-1\choose i-1\).

\[m!\sum^{m-1}_{i=0}\binom{n}i2^{n-i}\binom{m-1}{i-1} \]

总结一下

\(p\) 很小的时候,下指标求和可以用 \(Lucas\) 定理递归求解。

\(n \le m\) 的时候,可以用一行之和来求。

拓展

  1. 错排
  2. 卡特兰数
  3. 斯特林数
  4. 二项式/容斥
  5. 牛顿级数
posted @ 2025-01-22 21:38  花子の水晶植轮daisuki  阅读(78)  评论(0)    收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js