计数 / 组合数学 学习笔记
组合数等式
第一个等式:\(\sum_{i=0}^m\binom{n+i}{n}=\binom{n+m+1}{n+1}\)。
组合意义证明:从 \(n+m+1\) 个球里面选 \(n+1\) 个球,枚举第 \(n+1\) 个球的位置 \(n+1 \sim n+m+1\)。那么前面就剩下 \(n\sim n+m\) 个空位,从这些空位里选出 \(n\) 个位置放球,方案数是 \(\binom{n+i}{n}\)。
第二个等式:\(\sum_{i=0}^m \binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k}\)。
组合意义:?
第三个等式:\(\binom{n}{i}\binom{i}{j}=\binom{n}{j}\binom{n-i}{i-j}\)。
组合意义证明:从 \(n\) 个球里选 \(i\) 个球,再从这 \(i\) 个球里选 \(j\) 个球,等价于先选出最后这 \(j\) 个球,再选出第一步被选出但第二步没被选出的这 \(i-j\) 个球。
二项式定理
归纳证明:
常见组合式
1.一个长度为 \(n\),值域在 \([1,m]\) 的不降数列数量为 \(\binom{n+m-1}{n}\)
证明:考虑给第二个数加 \(1\),第 \(n\) 个数加上 \(n-1\),那么问题就转化为了长为 \(n\),值域为 \([1,n+m-1]\) 的方案数,直接选 \(n\) 个即可
凯莱定理
基础版本:\(n\) 个点的有标号无根树共有 \(n^{n-2}\) 种。
扩展版本:\(n\) 个点,共有 \(s\) 棵树的森林共有 \(sn^{n-s-1}\) 种。
Sasha and Interesting Fact from Graph Theory
枚举 \(a\) 与 \(b\) 中间的边数 \(i\),那么考虑:
-
用了 \(i+1\) 个点,除了 \(a,b\) 还有 \(i-1\) 个,方案数是 \(\binom{n-2}{i-1}\)。
-
选出的 \(i-1\) 个点可以乱排,方案数是 \((i-1)!\)。
-
赋边权相当于在 \(m-1\) 个空内插 \(i-1\) 个板,方案是数 \(\binom{m-1}{i-1}\)。
-
其他边没有限制,方案数 \(m^{n-1-i}\)。
-
其他的点要挂在这 \((i+1)\) 个点下面,由凯莱定理,得方案数是 \((i+1)n^{n-(i+1)-1}\)。
所以总方案就是:
容斥原理
Lemma 1
证明:考虑使用二项式定理,将原式转化为
当 \(n=0\) 时,原式无意义,将 \(n=0\) 带入左式得数为 \(1\),故得证。
Lemma 2
二项式反演:
证明:
[ABC276G] Count Sequences
记 \(b_i\) 为 \(a_i\) 的差分数组,\(a\) 与 \(b\) 唯一对应。
那么问题转化为对满足以下条件的 \(b\) 计数:
\(b\) 全部非负,\(b_i(2 \le i \le n)\) 模 \(3\) 的余数为 \(1\) 或 \(2\),\(\sum b \le m\)。
考虑确定一下 \(b_1 \bmod 3\) 的值,因为只有两种。它不需要递增啊!
假设 \(b_1=a+3k\),其余的 \(b\) 中有 \(r\) 个模 \(3\) 为 \(2\),那它们对和的占用就是 \(a+r+n-1\),剩下的就是 \(m-a-r-n+1\),现在我们补上一堆 \(3k\),那么这个量不会超过 \(S=\lfloor \frac{m-a-r-n+1}{3} \rfloor\)。
这部分的方案数是 \(\sum_{i=1}^S \binom{n+i-1}{n-1}=\binom{n+S}{n}\)。做完了捏。
第一个有用的东西是数列不减考虑差分,也便于刻画相同的情况。
二是考虑算重,直接用幂的情况必须完全互不影响,先给 \(1\) 放上再给 \(2\) 放上,和先给 \(2\) 放上再给 \(1\) 放上显然是相同的。
[ABC180F] Unbranched
首先转化一下题目:求有 \(n\) 个点,\(m\) 条边,每个联通块都是链或简单环且大小不超过 \(L\) 的方案数。
dp,设 \(f_{i,j}\) 表示处理了 \(i\) 个点,\(j\) 条边的图的方案数,这里的“处理了”并不是指在编号上的选取,而是目前规划的图的点数,这一点要格外注意。转移时考虑枚举新一个联通块的大小。
这样显然会算冲,因为我们钦定了联通块的顺序,那怎么办呢。我们可以使用选取基准点的思想,枚举的是当前未被选取的编号最小的点所在的联通块大小,那么这样就非常对了。这种思想在计数题中非常重要。
方程其实不难想到,分成链和环两部分。
链:\(f_{i,j}=\sum_{k=1}^{\min(n,L,j+1)} f_{i-k,j-(k-1)}\binom{n-(i-k)-1}{k-1}\frac{k!}{2}\)。含义是先从剩下的点中选 \(k\) 个,但是钦定了一个,所以要减一。后面则是 \(k\) 个点的链的方案数。除二是因为每种排列方式反过来本质一样。
环:\(f_{i,j}=\sum_{k=2}^{\min(n,L,j)} f_{i-k,j-k}\binom{n-(i-k)-1}{k-1}\frac{(k-1)!}{2}\)。最后那个是因为环循环同构,所以要在排列数上除掉点数。
注意联通块的上下界和一个特判:如果当前的阶乘为 \(1\),那么就不要再除二了。
初值显然为 \(f_{0,0}=1\),答案为 \(f_{n,m}\),时间复杂度 \(\mathcal{O}(n^2m)\)。
[AGC041D] Problem Scores
条件三是前 \(k+1\) 个数的和要大于后 \(k\) 个数的和。
有没有可能某个 \(k\) 的限制是最紧的呢?确实是这样的。考虑 $k=\lfloor \frac{n}{2}\rfloor $,那么 \(k\) 变小左边去掉得数不大于右边去掉的数,一直满足,\(k\) 变大出现交集,去掉交集后转化为 \(k\) 变小。
现在要求你前 \(k+1\) 个数大于后 \(k\) 个数,咋做呢。
考虑维护这两个和的差值。初始时令所有数都为 \(n\)。单调不减转化为每次拿出一个前缀减一。可以计算出每个前缀 \([1,i]\) 对差值的减小量。
你只需要从里面选出若干个,每个可以选多次,使得它们的和不超过 \(n-1\)。如果超过了就不是严格大于了,完全背包即可。
这里的背包应该倒着做,我们原来完全背包正序循环是为了让先更新的能更新后更新的,同理,现在应该倒序循环。
P9745「KDOI-06-S」树上异或
考虑值域小的做法,设 \(f_{x,v}\) 表示不考虑以 \(x\) 为根的子树外面的,仅考虑它里面,且根所在的连通块异或和为 \(v\) 的各个方案分出的连通块的权值和。
转移考虑如果这条边不断,那么跟所在的连通块会与这个子节点权值发生异或;如果断,就要乘上这个子节点连通块的权值。
所以 \(f_{y,j} \times f_{x,i \oplus j} \to f_{x,i},f_{y,j} \times j \times f_{x,i} \to f_{x,i}\)。注意要先存下来之前的 \(f\),防止第一个相互转移。
优化只需考虑把每一位分别计算即可,记 \(f_{x,p,i}\) 表示第 \(p\) 为值为 \(i\) 的结果,转移变化为。
\(f_{x,p,j} \times f_{y,p,i \oplus j} \to f_{x,p,i},f_{x,p,i} \times 2^j \times f_{y,j,1} \to f_{x,p,i}\)
对于子节点的第二个转移,我们计算的是 \(f_{x,p,i} \times \sum (2^j\times f_{y,j,1})\),容易提前计算,时间复杂度 \(\mathcal{O}(n \log V)\)。

浙公网安备 33010602011771号