组合数学
组合数学
组合数定义式
\(\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)\)
相关结论
- \(n^{\overline{m}}=(n + m - 1)^{\underline{m}}\),用于处理上升幂
- \(n^{\underline{m}}=(-1)^{m}(m - n - 1)^{\underline{m}}\),用于处理 \(n < 0\) 情况
- \(x^{\underline{n}}=(-1)^{n}(-x)^{\overline{n}}\),用于上升下降幂的转换
- \(\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把笔记的照片转文字的来的,可能会有错]
取模意义下的组合数
一些引理
-
\(\binom{p}{n} \bmod p = [n = 0 \vee n = p]\),
证明:\(\binom{p}{n}=\frac{p!}{n!(p - n)!}\),因为分子只有一个p,分母只有在n=p或n=0时有p。
-
\[\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} $ 是 \((x + 1)^n\) 的 \(x^m\) 项系数。
拓展 Lucas
用于处理模数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 求逆,我们只需要求形如下面这样的式子:
前面两个是 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)\),求
直接循环卷积快速幂,时间复杂度 \(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\) 分类
再用 Lucas 定理展开:
注意到 \(\sum\limits_{j = 0}^{p - 1} \binom{n \bmod p}{j}\) 用一行之和定理表示为 \(2^{n \bmod p}\),\(\binom{\frac np}{\frac kp}\) 始终为定值,而且可以用普通的 Lucas 来求,于是上式可改写为:
然后发现左边可以递归,右边 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
四,用组合意义
例题(某联考题):
n 是1e9, m 是1e6,p是1e9+7
有一种用斯特林数把上升幂转普通幂转下降幂,然后用斯特林数奇妙公式乱搞的做法,但是用组合意义做会有奇效。
简单转换一下式子:(把上升幂转组合数形式)
先不看 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}\).
所以答案是:
还有一种更简单的理解方法:在 n 个盒子里选择 i 个,在这 i 个盒子里插 m 个相同的球,可以有空盒子的方案数。
改为枚举放了球的盒子数量 (认为只有这 i 个盒子放了球,其他盒子不放球) ,其它盒子任意选/不选(就算不放球也可以被选中),在这 i 个盒子里放 m 个球,要求盒子非空,这又是一个插板法,小推一下是 \(m-1\choose i-1\).
总结一下
当 \(p\) 很小的时候,下指标求和可以用 \(Lucas\) 定理递归求解。
当 \(n \le m\) 的时候,可以用一行之和来求。

浙公网安备 33010602011771号