计数 / 组合数学 学习笔记

组合数等式

第一个等式:\(\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\) 个球。

二项式定理

\[(a+b)^n =\sum _{i=0}^n \binom{n}{i} a^i b^{n-i} \]

归纳证明:

常见组合式

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}\)

所以总方案就是:

\[\sum_{i} \binom{n-2}{i-1}\binom{m-1}{i-1}(i-1)!m^{n-i-1} (i+1)n^{n-(i+1)-1} \]

容斥原理

Lemma 1

\[\large \sum_{i=0}^n (-1)^i \binom{n}{i}=[n=0] \]

证明:考虑使用二项式定理,将原式转化为

\[\large \sum_{i=0}^n (-1)^i 1^{n-i} \binom{n}{i}=(-1+1)^n=0^n \]

\(n=0\) 时,原式无意义,将 \(n=0\) 带入左式得数为 \(1\),故得证。

Lemma 2

\[\large \Big\lvert \bigcup_{i=1}^n \Big \rvert S_i=\sum_{T \subseteq \{1,2,\dots,n\},T \neq \emptyset } (-1)^{|T|-1} \Big\lvert \bigcap_{j\in T} S_j\Big \rvert \]

二项式反演:

\[f(x)=\sum_{i=0}^x (-1)^i\binom{x}{i}g(x)\leftrightarrow g(x)=\sum_{i=0}^x (-1)^i \binom{x}{i}f(i) \]

证明:

\[f(x)=\sum_{i=0}^x (-1)^i \binom{x}{i}\sum_{j=0}^i (-1)^j \binom{i}{j}f(j) \]

\[=\sum_{i=0}^x f(i)\sum_{j=i}^x(-1)^{i+j}\binom{x}{j}\binom{j}{i} \]

\[=\sum_{i=0}^x f(i)\sum_{j=i}^x(-1)^{i+j}\binom{x}{i}\binom{x-i}{j-i} \]

\[=\sum_{i=0}^x \binom{x}{i}f(i)\sum_{j=i}^x(-1)^{i+j}\binom{x-i}{j-i} \]

\[=\sum_{i=0}^x \binom{x}{i}f(i)\sum_{j=0}^{x-i}(-1)^{2i+j}\binom{x-i}{j} \]

\[=\sum_{i=0}^x \binom{x}{i}f(i)\sum_{j=0}^{x-i}(-1)^{j}\binom{x-i}{j} \]

\[=\sum_{i=0}^x \binom{x}{i}f(i)[x-i=0] \]

\[=\binom{x}{x}f(x) \]

\[=f(x) \]

[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)\)

posted @ 2024-08-26 09:04  aCssen  阅读(24)  评论(0)    收藏  举报