计数相关
容斥原理:
一般化定义:
设全集 \(U\) 中有的元素有 \(n\) 种属性,第 \(i\) 种属性为 \(P_i\) ,拥有 \(P_i\) 属性的元素构成集合 \(S_i\)。
证明:
简单使用二项式定理计算系数,对于任意一个元素我们设它出现在 \(K\) 个集合中,如果它想出现在 \(m\) 个集合的交集中则有 \({K\choose m}\) 中情况,那它被计算的次数 \(Cnt=\sum_{i=1}^{K}{K\choose i}(-1)^{i-1}=1-\sum_{i=0}^{K}{K\choose i}(-1)^i=1-(1-1)^K=1\)
对于补集的容斥:
容斥原理是求集合并集大小,如果我们要求交集大小呢。集合的交集等于全集减去 补集的并集 ,即:
容斥原理的简单应用:
不定方程非负整数解计数:
给出不定方程 \(\sum_{i=1}^{n}x_i=m\) 和每一个 \(x_i\) 的取值范围 \(l_i,r_i\) ,\(x_i\)为非负整数,求解的数量。
对于下界我们可以在初始时直接减去相当于下界为 \(0\) ,那我们只剩下了一个上界。我们考虑建立容斥模型,设每个满足元素取值范围集合为 \(S_i\) ,我们相当于要求 \(\left| \bigcap_{i=1}^{n}S_i \right|\),直接使用补集容斥,那问题有转化为求若干个 \(\overline{S_i}\) 的交集大小,那我们又可以将下界减去,然后插板法计数即可。
共有 \(4\) 种硬币。面值分别为 \(c_1,c_2,c_3,c_4\)。
某人去商店买东西,去了 \(n\) 次,对于每次购买,他带了 \(d_i\) 枚 \(i\) 种硬币,想购买 \(s\) 的价值的东西。请问每次有多少种付款方法。
\(s\le 1e5,n\le 1e5\)
如果没有个数的限制,那直接预处理一个完全背包就好了。现在有了硬币个数的限制,我们考虑容斥掉不合法的方案,钦定有几种硬币至少选满,其他随便选,乘上相应的容斥系数,这样就可以 \(2^4\) 回答询问。
组合计数:
一些基础的符号:
排列数:\(A_n^{m}\)
组合数:$\binom{n}{m}=C_n^{m}= \frac{n!}{m!(n-m)!} $
组合数性质:
-
\[\binom{n}{m}=\binom{n}{n-m} \]
相当于对每一个选出的集合取补集
-
\[\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1} \]
从组合意义来看,从n个数中选出m个,讨论是否选第n个,若不选有\(C_{n-1}^{m}\)种,若选有\(C_{n-1}^{m-1}\)种,相加即可
- \({n \choose m}=\frac{n}{m}{n-1\choose m-1}\)
证明比较显然,这个式子被称为吸收公式。
它的一些常用推论 \(m{n\choose m}=n{n-1\choose m-1}\) ,\((n-m){n\choose m}=n{n-1\choose m}\)
-
\[\sum_{i=0}^{n}\binom{n}{i}=2^n \]
\((1+1)^n\) 的二项式定理展开形式
-
\[\sum_{i=0}^{n}\binom{i}{k}=\binom{n+1}{k+1} \]
还是从组合意义来看,我们前边每一组从\(n\) 个数中选出 \(k\) 个数的方案,设最靠后的数的位置为 \(p\),则一共被统计了 \(n-p+1\) 次,那我们可以看做从后边的 \(n-p+1\) 个数中再选出来一个,那也就得出了后边的式子\({n+1 \choose k+1}\)
-
\[\binom{n}{k}\binom{k}{r}=\binom{n}{r}\binom{n-r}{k-r} \]
从 \(n\) 个数中选出 \(k\) 个,再从 \(k\) 个数中选出 \(r\) 个,也可以看做从 \(n\) 个数中先选 \(r\) 个,再从剩下的 \(n-r\) 个中选\(k-r\) 个,也可以从代数角度证明。
\({n \choose k}{k \choose r}=\frac{n!k!}{k!(n-k)!r!(k-r)!}=\frac{n!(n-r)!}{r!(n-r)!(n-k)!(k-r)!}=\frac{n!}{r!(n-r)!} \frac{(n-r)!}{(n-k)!(k-r)!}={n \choose r}{n-r \choose k-r}\)
-
\[\sum_{i=0}^{n}\binom{n-i}{i}=F_{n+1} \]
我们采用数学归纳法,当 \(n=1\) 时\(\sum_{i=0}^{n}\binom{n-i}{i}=F_{n+1}=1\)
当 \(n=2\) 时\(\sum_{i=0}^{n}\binom{n-i}{i}=F_{n+1}=2\)
对于 \(n\ge 2\) ,由\(F_{n+1}=F_{n}+F_{n-1}\)可得,我们证明\(\sum_{i=0}^{n}\binom{n-i}{i}=\sum_{i=0}^{n-1}\binom{n-1-i}{i}+\sum_{i=0}^{n-2}\binom{n-2-i}{i}\)即可
右边\(=\sum_{i=0}^{n-1}\binom{n-1-i}{i}+\sum_{i=1}^{n-2}\binom{n-1-i}{i-1}+1\)
\(=\sum_{i=1}^{n-2}[\binom{n-1-i}{i}+\binom{n-1-i}{i-1}]+1\)
\(=\sum_{i=1}^{n-2}\binom{n-i}{i}+1\)
\(=\sum_{i=0}^{n}\binom{n-i}{i}\)
-
\[\sum_{i=0}^{k}\binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k} \]
从组合意义来看即可,这个东西也叫做范德蒙德恒等式,可以以这个式子为基础,衍生出一些推论
- \(\sum_{i=0}^{n}i{n \choose i}=n2^{n-1}\)
吸收公式的的应用, \(\sum_{i=0}^{n}i\frac{n!}{i!(n-i)!}=\sum_{i=0}^{n}n\frac{(n-1)!}{(i-1)!(n-i)!}=n\sum_{i=0}^{n}{n-1\choose i-1}=n2^{n-1}\)
- \(\sum_{i=0}^{n}i^2{n \choose i}=n(n+1)2^{n-2}\)
和上面同理,运用吸收公式,直接跳过前几步,\(n\sum_{i=0}^{n} i{n-1 \choose i-1}=n(\sum_{i=0}^{n-1}i{n-1 \choose i}+\sum_{i=0}^{n-1}{n-1 \choose i})\)
中间那一项套用公式 \(9\) ,\(n((n-1)2^{n-2}+2^{n-1})=n(n+1)2^{n-2}\)
-
\[\sum_{i=0}^{n}\binom{i}{k}(i+1)=(k+1)\binom{n+2}{k+2} \]
我们把前边式子拆开\(\binom{i}{k}(i+1)=\frac{i!}{(i-k)!k!}*(i+1)=\frac{(i+1)!}{(i-k)!k!}\) 我们考虑再凑一个组合数出来,\(\frac{(i+1)!}{(i-k)!k!}=(k+1)\frac{(i+1)!}{(i-k)!(k+1)!}=(k+1)\binom{i+1}{k+1}\) 再套用性质四的结论即可。
- \(\sum_{k=0}^{n}{r+k \choose k}={r+n+1\choose n}\)
杨辉三角斜向求和式,从 \((r,0)\) 开始向右下数 \(n\) 个数之和,等于结尾位置下方的数。
证明考虑 \({r \choose 0}\) 与 \({r+1 \choose 0}\) 相等,然后逐项利用加法公式合并即可。
补充:
我们上文用到的二项式系数,都是在非负整数的定义域内。
实际上我们我们可以通过下降幂将上指标拓展到实数域,下指标拓展到整数域的,即,
虽然这样失去了很多组合意义,但其在数学意义上有很大作用。
下面我们来观察一下负数意义下的二项式系数表。
通过观察我们可以发现,\(r\) 为负数时,我们有另类的加法公式 \({r \choose k}={r+1\choose k} -{r\choose k-1}\)
证明也很简单,将下降幂拆开即可。
接下来我们考虑上指标为正,和为负,之间是否存在转化关系。我们就发现了 上指标反转 公式。
证明,当 \(k\ge 0\) 时我们有,下降幂的上指标反转公式。
有了这个式子我们就可以轻松证明上面的公式了。
根据上面的式子我们有推论
例题:
简要题意:给定常数 \(k\)。对于一个长度为 \(n\) 的排列 \(a\),定义$$f(a)={\max_{1 \le i \le k} {a_i},\max_{2 \le i \le k+1} {a_i},\cdots,\max_{n-k+1 \le i \le n} {a_i}}$$
对于一个长度为 \(n\) 的序列 \(a\),定义其权值 \(w(a)\) 为 \(a\) 中不同的数的个数。对于所有长度为 \(n\) 的排列 \(p\),它们的 \(w(f(p))\) 之和。\(n\le 1e6\),加强版 \(n\leq 1e9\)
解法较多,这里介绍一种直接计算的方法。
对于题目要求的答案,每一个数所产生的贡献是互不影响的,我们分开计算,\(f\) 序列长度为 \((n-k+1)\),\(i\) 出现在其中一个位置就要伴随着 \(k-1\) 个比 \(i\) 小的数,那此时的方案数即为 \((n-k+1)*\binom{i-1}{k-1}*k!\)。由于重复出现只记一次,我们计算在 \(f\) 序列中\(i\) 第一次时的方案,
II.BZOJ4361 isn
给出一个长度为 \(n\) 的序列 \(a_1,a_2,\dots a_n\)。如果序列 \(a\) 不是非降的,你必须从中删去一个数。
这一操作将被不断执行,直到 \(A\) 非降为止。求有多少种不同的操作方案。操作方案不同当且仅当删除的顺序或次数不同。答案对 \(10^9+7\) 取模。
\(n \le 1000\)
很神的计算方法,我们先来考虑一个弱化版,当 \(A\) 变为非降后我们可以选择是否继续进行操作,这样我们可以直接进行DP ,设 \(f_{i,j}\) 表示最终剩下以 \(i\) 结尾长度为 \(j\) 的不同非降序列数,转移是平凡的,可以用树桩数组优化到 \(n^2\log n\) , 设 \(g_i\) 表示最终剩下长度为 \(i\) 的不同非降序列数,那最终的答案为 \(\sum_{i=1}^{n} g_i*(n-i)!\) ,这样我们就解决弱化版问题。原问题增加了一个 A变为非降就终止 的限制,然后通过惊人的思考发现,对于任意一个非降序列,如果它不是终止点,那它长度加 \(1\) 的上一个序列一定也非降,长度为 \(i\) 的非降序列都对应着 \(i\) 个长度为\(i-1\) 的非降序列。那原问题的答案即为 \(\sum_{i=1}^{n} g_i*(n-i)!-g_{i+1}*(n-i-1)!*(i+1)\)
III.[Problem B: 二色莲花蝶](Problem B: 二色莲花蝶 (butterfly))
多组询问 $ n,k $,求 \(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}(i+k)(j+k)\)
\(T\le 10^5 , n,k\le 10^{18}\)
给出一种最暴力的拆式子方式 ,先把后面乘法拆开,\((ij+ik+jk+k^2)\) ,然后逐项化简。
这里先解决两个式子后面会用到。
对于这种相邻两项有关的式子我们可以考虑列项相减。
\(2*F(n)-F(n)=2^{n+1}n-\sum_{i=1}^{n}2^i\)
\(F(n)=2^{n+1}(n-1)+2\)
\(2*H(n)-H(n)=2^{n+1}n^2-2\sum_{i=1}^{n}2^ii+\sum_{i=1}^{n}2^i\)
\(H(n)=2^{n+1}(n^2-2n+3)-6\)
接下来对于拆出来的四项分别化简。
\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}k^2=\sum_{i=0}^{n}2^ik^2=(2^{n+1}-1)k^2\)
\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}ik=\sum_{i=0}^{n}2^iik=F(n)*k\)
\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}ij=\sum_{i=0}^{n}2^{i-1}i^2=\frac{G(n)}{2}\)
\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}jk=\sum_{i=0}^{n}2^{i-1}ik=\frac{F(n)}{2}k\)
每一项都是可以 \(O(\log n)\) 快速幂计算的,逐项算即可。
IV. AT_agc001_e [AGC001E] BBQ Hard
给出 \(n\) 个数对 \((a_i,b_i)\) ,求出 \(\sum_{i=1}^{n}\sum_{j=i+1}^{n}{a_i+b_i+a_j+b_j\choose a_i+a_j}\),答案对 \(1e9+7\) 取模。
\(n\le 2e5, a_i,b_i\le 2000\)
小巧思,这个数据范围肯定要在值域做些想法,我们有一个经典组合数式子,在网格图中从 \((0,0)\) 走到 \((n,m)\) 的方案数为 \({n+m \choose n}\) ,我们发现和本题的式子长得很像相当于从 \((-a_i,-b_i)\) 走 \((a_j,b_j)\) 的方案数。那原式就变成了多起点多终点的路径方案问题,可以用用一遍 \(2000\times 2000\) 的 \(dp\) 来解决,注意直接写会算上 \((-a_i,-b_i)\) 到 \((a_i,b_i)\) 的贡献,最后特殊减一下即可。
Ⅴ. CF660E Different Subsets For All Tuples
你有一个长度为 \(n\) 的序列,每个位置上的数字值在 \([1,m]\) 范围内,求出每种可能的序列的本质不同子序列个数之和(包含空序列),答案对 \(1e9+7\) 取模。
\(n\le 10^6\)
一开始写了一种枚举序列长度的方法,发现是一个分治 \(FFT\) 的形式。绷
考虑一种简单的做法,我们枚举本质不同子序列的长度 \(i\) ,长度为 \(i\) 的子序列一共有 \(m^i\) 种,我们可以把它们视为一种,考虑把它填到长度为 \(n\) 的序列中。为了不算重,我们钦定子序列上一个数的位置到当前数的位置之前,没有出现过当前数,也就是只有 \((m-1)\) 种可填的数。
此时,最后一个数后边的位置没有限制,那我们再枚举最后一个数填的位置 \(j\) 。选出位置的方案 为 \({j-1\choose i-1}\) ,有 \(m^i\) 种子序列,前 \(j\) 个位置中没有钦定的位置的方案数为 \((m-1)^{j-i}\) ,后面位置随便填 \(m^{n-j}\) 。整理一下式子可得。
又有二项式系数又有 \(i\) 次幂,看起来就很可以二项式定理,交换求和符号化简一下即可。
给定参数 \(b,c\) ,求满足以下条件的 \(m\) 元组 \((x_1,x_2,x_3…x_m)\) 的方案数。
- \(0\le x_i\le b^i-c,x\in\mathbb{Z}\)
- \(x_1+x_2+…+x_m< n\)
答案对 \(998244353\) 取模。
$1\le m\le 50,0\le n\le b^{m+1},2\le b\le 10^9,-b+2 \le c\le b-1 $
先把 \(n\) 减一,变成求 \(x_1+x_2+…+x_m\le n\) ,不考虑值域的限制就直接进行插板法即可,这里取值是 \(\le n\) 所以方案为 \({n+m\choose m}\) ,有了值域的限制,最暴力的是直接 \(2^m\) 容斥做,即
我们把 \(|S|\) 相同的拎出来一起计算
对于一个 \(k\) 来说 \(A\) 是一个定值。对于 \((A-\sum_{i\in S}b^i)^{\underline{m}}\) 这一项有很多种拆法,有一种前置较少的拆法是直接将其视为关于 \(\sum_{i\in S}b^i\) 的 \(m\) 次多项式,也就是 \(\sum_{j=0}^{m}a_k (\sum_{i\in S}b^i)^j\),式子就变成了两部分。
先求出第 \(k\) 项的系数 \(a_k\) ,我们设递推式 \(g_{i,j}\) 表示 \((A-x)^{\underline{i-1}}\) 的 \([x^j]\) 系数,递推式即为
接下来考虑如何求出对于每个 \(j\) 求出 \(\sum_{|S|=k}(\sum_{i\in S}b^i)^j\) ,依旧考虑递推,设 \(f_{i,j,k}\) 表示所有 \(S\subseteq \{1,2…i\}\),\(|S|=j\) ,\((\sum_{i\in S}b^i)^k\) 的和,根据二项式定理我们有递推式
分别代表是否选 \(b^i\) 这个数。但其实还有一个问题,我们在组合数转下降幂时,没有考虑范围的限制,
\({A-\sum_{i\in S}b^i\choose m}\) 可以化成 \(\frac{(A-\sum_{i \in S} b^i)^{\underline{m}}}{m!}\) 的前提是满足 \(A-\sum_{i\in S} b^i\ge 0\) ,所以我们不能直接简单递推,加上值域的限制后,如果我们将 \(A\) 视为一个 \(b\) 进制数,确定每个 \(b^i\) 取或不取的限制相当于一个数位 \(dp\) 的过程,我们直接从高位向低位考虑逐位确定,给 \(f\) 加一维 \(0/1\) 代表是否顶上界即可。对每一个 \(k\) 都要求一遍 \(f,g\) ,总的时间复杂度即为 \(O(m^5)\) 。
二项式定理
当\(a=1,b=-1\)时\((1-1)^n=\sum_{i=0}^{n}\binom{n}{i}(-1)^i\) 在一些反演证明中应用较为广泛
二项式反演
形式一:$$f(n)=\sum_{i=0}^{n}\binom{n}{i}g(i)\Longrightarrow g(n)=\sum_{i=0}^{n} (-1)^{n-i}\binom{n}{i}f(i) $$
证明:
形式二:$$f(n)=\sum_{i=n}^{m}\binom{i}{n}g(i)\Longrightarrow g(n)=\sum_{i=n}^{m} (-1)^{i-n}\binom{i}{n}f(i) $$
证明:
有些题目中会要求求出恰好 \(k\) 个满足限制的方案数,但是我们发现恰好的限制不好满足,就可以转化成求至少或至多的限制来做,然后套用二项式反演求出恰好。
对于形式 \(1\) ,\(f\) 相当于钦定了 至多 ,对于形式 \(2\) ,\(f\) 相当于钦定了 至少。
[P4859 已经没有什么好害怕的了](P4859 已经没有什么好害怕的了 - 洛谷)
给定两个长度为 \(n\) 数组 \(a,b\) ,保证 \(a,b\) 元素互不相同。
求 \(a,b\) 数组元素两两配对的方案,使得在 \(n\) 对中 \(a\) 比 \(b\) 大的恰好有 \(k\) 对。对于 \(1-n\) 的每一个 \(k\) 求出答案。\(n\le2000\)
恰好显然不好做,考虑二项式反演,如何求至少 \(k\) 个对 \(a>b\) ,跟大小有关,我们可以先将原数组排序,这样方便计数。然后考虑 \(dp\) 。
对于从小到大排完序的每个 \(a_i\) 可以配对的是 \(b\) 数组的一个前缀,且右端点单调右移,也就是说从小到大考虑 \(a_i\) ,只要我们知道了前边匹配了多少对,我们就可以知道现在还有多少个 \(b\) 可以与当前 \(a_i\) 配对,设 \(f_{i,j}\) 表示 \(a\) 数组前 \(i\) 个数中配对了 \(j\) 个的方案数。直接 \(dp\) 就好了,对于没有钦定的直接排列一下即可,最后别忘了反演出答案。
你有一棵包含 \(2n\) 个节点以 \(1\) 为根的树,其中 \(n\) 个为白点,另外 \(n\) 个为黑点。
进行 \(n\) 轮游戏,每轮游戏选出黑白点各 \(1\) 个,若这两个点存在父子关系则为非平局,求恰好有 \(k\) 轮游戏非平局的配对方案,注意这里不同方案指 配对关系 不同,并不关心顺序。对于 \(0-n-1\) 的每一个 \(k\) 求出答案。
\(n\le 5000\)
依旧是先反演一步转化成求至少,考虑树形 \(dp\) ,\(f_{i,j}\) 表示 \(i\) 的子树中钦定了 \(j\) 轮非平局的方案数,先用一个树上背包把子树答案合并起来,然后再判断当前点是否要选,只需要处理出子树中有多少个白点,黑点,我们知道当前钦定了多少对,那就知道了有多少点可以与当前点配对,就可以转移了,最后反演回去即可。
P11292 【MX-S6-T4】「KDOI-11」彩灯晚会
给定一张 \(n\) 个节点 \(m\) 条边的有向无环图,你可以选择将每个点染成 \(k\) 种颜色的的任意一种,一共有 \(k^n\) 种不同染色方案。
还给定了一个正整数 \(l\) ,对于一个方案,第 \(i\) 种颜色长度为 \(l\) 的链的数量 \(cnt_i\) ,则一个方案的美丽度 \(\sum_{i=1}^{k}cnt_i^2\)。
求出所有 \(k^n\) 种方案的美丽度之和。答案对 \(998244353\) 取模。
\(n\le 300 ,l\le 20\)
这个 \(cnt_i^2\) 的形式看起来只能先算 \(cnt_i\) 再平方,我们考虑用组合意义转化。
\(cnt_i^2\) 相当于选出两条颜色为 \(i\) 长度为 \(l\) 的的链的方案数,这 \(k\) 种颜色本质上没有什么区别,我们算出钦定一种再乘 \(k\) 即可。
考虑计数,最暴力的方法是我们枚举两条长度为 \(l\) 的链,钦定这两条链的颜色相同,其他的节点颜色可以任选。我们发现在这个过程中,最关键的是两条链重和了多少个节点,设两条链重合了 \(x\) 个点,贡献系数即为 \(k^{n-2l+x+1}\) 。
我们现在的问题转化为求在图上选出两条长为 \(l\) 的链恰好重合了 \(x\) 个点的方案数。看到恰好 \(x\) 个,我们可以直接套一个二项式反演,转变成求钦定 \(x\) 个重合。
考虑在拓扑序上 \(dp\) 计数,设 \(dp_{x,u,l1,l2}\) 表示已经钦定了 \(x\) 个点重合,最后一个重合点为 \(u\) ,第一条链长度为 \(l1\) ,第二条链长度为 \(l2\) 的方案数。转移过程考虑枚举下一个重合点 \(v\) ,我们预处理出来 \(d_{u,v,len}\) 表示从 \(u\) 到 \(v\) 长度为 \(len\) 的不同路径数,转移式即为 \(dp_{x+1,v,l1+len1,l2+len2}+=dp_{x,u,l1,l2}*d_{u,v,len1}*d_{u,v,len2}\) ,同时为了初始化,和处理最后的散段,要预处理出 \(s_{u,i},t_{u,i}\) 表示以它为起点、终点的长度为 \(i\) 的路径数,预处理的时间复杂度为 \(O(n^3l)\) 。直接暴力转移是 \(O(n^2l^5)\) 的,显然太慢了。考虑优化,首先我们同时枚举 \(len1,len2\) 转移是没有意义的,可以分步转移做到 \(O(n^2l^4)\) ,还是不够快。我们考虑到二项式反演的式子中有组合数,并且最后的贡献系数中还有 \(k^{n-2l+x+1}\) ,那是不是可以用二项式定理合并到一起呢。设 \(g\) 表示钦定,\(f\) 表示恰好。
有了这个式子我们就没有必要记录第一维,重和了多少点了,直接每转移一步就乘一个 \((k-1)\) 的系数就好了。
搭配上分步转移,时间复杂度为 \(O(n^2l^3+n^3l)\) ,究极卡常,可以用邻接表存图会快一些。
你现在有一个长度为 \(n\) 的数组 \(a\)。一开始,所有 \(a_i\) 均为 \(0\)。给出一个同样长度为 \(n\) 的目标数组 \(b\)。求有多少种方案,使得通过若干次以下操作,可以让 \(a\) 数组变成 \(b\)。
- 选出两个不同的下标 \(1\leq i<j\leq n\),并将 \(a_i\) 和 \(a_j\) 同时增加 \(1\)。
两种方案被称之为不同的,当且仅当存在一个 \(x\) 使得一种方案中第 \(x\) 次操作选择的两个下标 \((i,j)\) 与另一种方案中的不同。
答案对 \(998244353\) 取模。
\(1\le n\le5~000\),\(1\leq b_i\le30~000\),\(\sum b_i\le30~000\)。
第一类斯特林数
- \(s(n,m)\) 表示将 \(n\) 个元素分成 \(m\) 个轮换的方案数
- 也可记作 \({n\brack m}\)
递推式:
\({n\brack m}={n-1\brack m-1}+(n-1){n-1\brack m}\)
表示可以自己单独拿出来成为一个轮换,或者插到任意一个数前面
结论一: $$ n!=\sum_{i=0}^{n} {n\brack i} $$
证明:显然一个排列唯一对应一个置换,一个置换唯一对应一个轮换。
结论二:
证明:利用数学归纳法和递推式,\(n=1\) 时显然成立,
同理我们可得
求一行斯特林数
第二类斯特林数
- \(S(n,m)\)表示把\(n\) 个元素划分为 \(m\) 个子集的方案数
- 记作\({n \brace m}\)
递推式:
\({n \brace m}={n-1 \brace m-1}+m{n-1 \brace m}\)
- 可以看做新开一个集合或者放到之前任意一个集合中
结论一:
证明:依旧考虑数学归纳法
一种组合意义的证明,把前边的式子可以理解为把 \(m\) 个不同的球放入 \(n\) 个不同的盒子中,右边的式子可以理解为先钦定有球的盒子个数再计数,两者等价。
由此我们也可知 $${n \choose i}i!=n^{\underline{i}}$$
结论二:
证法一:继续归纳
证法二:
直接由结论一的第二个式子二项式反演可得
斯特林反演:
前置:
翻转公式:
证明:
首先我们有
代入第一类斯特林数的结论二
只有 \(i=m\) 时后边系数为 \(1\) 否则为零
另外一个式子同理代入可得
反演公式:
格路计数
一类比较有趣的组合问题,很多问题都可以转化为格路计数的变式。
我们规定在二维平面直角坐标系中,横纵坐标均为整数的点为格点,格路为从一个个点走到另一个格点的路径,格路长度为其步数。
下文我们只讨论只存在右行和上行步的情况。
最简单的问题,从 \((0,0)\) 到 \((n,m)\) 的不同格路数有 \({n+m\choose n}\) 条。
卡特兰数
这是一种与格路计数紧密相关的数列,卡特兰数的一种定义为,从 \((0,0)\) 走到 \((n,n)\) 且不越过直线 \(y=x\) 的方案数。
有递推式 \(H_n=\sum_{i=1}^{n} H_{i-1}H_{n-i}\) 。
含义:枚举第一次与直线 \(y=x\) 相交的位置 \(i\) ,在 \((i,i)\) 第一次与 \(y=x\) 相交的方案数为 \(H_{i-1}\) ,后面不越过 \(y=x\) 的方案数为 \(H_{n-i}\)。
卡特兰数的一种通项公式为 \(H_n={2n \choose n}-{2n \choose n-1}\)
这里就用到的一种容斥方法,反射容斥 。我们发现越过 \(y=x\) 的格路一定与 \(y=x-1\) 相交。我们取最靠后的交点,将其以后的路径全部沿 \(y=x-1\) 翻折,此时所有翻着后的路径,与从 \((0,0)\) 到点 \((n+1,n-1)\) 的路径一一对应,也就是所有从 \((0,0)\) 到 \((n,n)\) 的不合法路径与之一一对应。相减取补集即为答案。
卡特兰三角
卡特兰数的进一步推广,定义 \(H(n,k)\) 表示从 \((0,0)\) 走到 \((k,n)\) 且不越过直线 \(y=x\) 的格路数量,(由 \(n\) 个 \(1\) ,\(k\) 个 \(-1\) 构成的序列,前缀和序列都不小于零)。
- \(H(n,0)=1,n\ge 0\)
- \(H(n,1)=n,n\ge 1\)
- \(H(n,k)=H(n,k-1)+H(n-1,k),2\le k \le n\)
- \(H(n,n)=H(n,n-1),n\ge 2\)
- \(H(n,k)=\sum_{i=0}^{k}H(n-1,i)\)
- \(H(n,k)={n+k \choose k}-{n+k\choose k-1}=\frac{n+1}{n-k+1} {n+k \choose k}\)
- \(H(n,k)=\sum_{i=0}^{k}H(n-1,i)=\sum_{i=k}^{n}H(i,k-1)\)
证明:
公式 \(7\) 可以直接由定义理解。
对于公式 \(6\) 来说,我们延续上面的反射容斥即可证明,其余式子将 \(6\) 带入即可证明。
一般化
定义 \(H_m(n,k)\) 表示,从 \((0,0)\) 走到 \((k,n)\) 不越过直线 \(y=x-m+1\) 的格路数。
和上面唯一不同的是通项 \(H_m(n,k)={n+k \choose k}-{n+k\choose k-m}\) ,依旧是利用反射容斥。
双线反射容斥
求从 \((0,0)\) 走到 \((n,m)\) ,且不触碰 \(y=x+l\) 和 \(y=x+r\) ,\((l<0<r)\) 的格路数量。
我们用 \('L'\) 表示与 \(y=x+l\) 相交,用 \('R'\) 表示与 \(y=x+r\) 相交。连续多次相交同一条直线视为一次相交,设 \(f(S)\) 表示顺次处理 \(S\) 中的对称得到的答案,设 \(x,y\) 为经过对称后的起点 ,\(f(S)={n-x+m-y\choose n-x}\) 。
下面需要一个并不是很显然的多步容斥。
\(Ans=f(∅)-f(L)-f(R)+f(LR)+f(RL)-f(LRL)-f(RLR)...\)
证明:
我们考虑对于一个串 \(LRLRL\) 被计算了多少次 ,由于反射容斥每次钦定的是第一个相交的位置,所以会在以 \(L\) 开头和以 \(R\) 开头时分别计算到以它开始的每一个前缀,对于例子来说 \(L,LR,LRL,LRLR,LRLRL\) 的系数分别为 \(-1,1,-1,1,-1\),\(R,RL,RLR,RLRL\) 系数为 \(-1,1,-1,1\) ,两组相加结果一定为 \(-1\) ,在加上空集的贡献,总贡献为 \(0\) 。
通过手玩对称过程,我们发现原式可以化简为
\(Ans=\sum_{k\in Z} {n+m \choose n-k(r-l)}-{n+m \choose n-k(r-l)+r}\)
直接计算时间复杂度为 \(O(\frac{n+m}{r-l})\)
[P3266 [JLOI2015] 骗我呢]([P3266 JLOI2015] 骗我呢 - 洛谷)
一个 \(n*m\) 的数组,要求满足 \(x_{i,j}<x_{i,j+1},x_{i,j}<x_{i-1,j+1}\),且 \(0 \le x_{i,j} \le m\)
求合法的填数方案,\(n,m\le 1e6\),答案对 \(1e9+7\) 取模。
容易发现,一共有 \(m+1\) 种数,每一行要填单调递增的 \(m\) 个,那关键的也就是谁被删去了。
手玩发现,若第 \(i\) 行被删去的为 \(x\) ,则第 \(i-1\) 行被删去的只能是 \([0,x+1]\) ,这样我们就可以写出转移式$$f_{i,0}=f_{i-1,0}+f_{i-1,1},f_{i,j}=f_{i,j-1}+f_{i-1,j+1}$$
由于最终答案是一个求和的形式,我们直接给转移加上一行,最终答案就是 \(f_{n+1,m}\)。
我们发现转移式和前边很相似,但是有 \(f_{i-1,j+1}\) 这一项,我们把第 \(i\) 行向右平移 \(i\) 个单位长度,这样就可以把 \(j+1\) 扔掉,同时我们需要在前面补上一个点来维护 \(0\) 的转移。这时候就跟我们格路计数的式子一模一样了。我们把它放到平面直角坐标系中来看(第一行纵坐标为 \(0\) )。
绿色的代表我们维护 \(0\) 的转移而增加的边。从实际含义上来看,对于第 \(i-1\) 行我们从第 \(j\) 个位置上移到下一行,代表我们原数组中第 \(i\) 行删去了 \(j-i\) 。同时有含义可知,路径不经过 \(y=x+1\) 或 \(y=x-m-2\) 这两条直线(值域要求)。那直接套用双射线反射容斥即可。
[Problem B: 阴暗扭曲的爬行](Problem B: 阴暗扭曲的爬行)
你有一个无限长的数轴,初始你在 \(0\) 处。接下来 \(2n\) 秒内,每秒你可以可以选择向左或向右移动一个单位长度,如果到达了 \(n\) 处则立即结束,求有多少种到达 \(n\) 出的移动方案。\(n\le 1e6\)
向左、向右可以分别对应向上、向右,到达 \(n\) 处也就代表在到达 \(y=x-n\) 这条线。由于到达之后立即停止,那最后一步一定是向右的,那我们把这条直线向左平移一个单位长度。
那原题就转化为用不超过 \(2n\) 步到达直线 \(y=x-m+1\) 上的,且不经过直线 \(y=x-m\) ,直接枚举到哪个点,反射容斥即可。