计数问题学习笔记
基础差得死,整版讲课课件能看懂的就 \(10\%\),所以过来补一补。数学那一块差不多,计划单开一个博客。分类整理以下吧。
卡特兰数
问题引入
有一个大小为 \(n\times n\) 的网格图,每次从 \((x,y)\) 只能走一步到 \((x+1,y)\) 或 \((x,y+1)\),求不走到对角线即 \(y=x\) 下方,但可以触碰对角线,从 \((0,0)\) 走到 \((n,n)\) 的方案数。
解法
直接推还是有难度的。正难则反,我们考虑用容斥整出答案。首先,从 \((0,0)\) 到 \((n,n)\) 的路径方案数是 \(\binom{n+n}n=\binom{2n}n\),这个好算。尝试构造不合法情况,这个时候可以触碰 \(y=x\) 的性质就很烦了,因此将条件转化一下,变成不触碰 \(y=x-1\) 的方案数。继续观察,不难发现在这个条件下以 \((1,-1)\) 为起点的到 \((n,n)\) 的路径全部经过了 \(y=x-1\)。考虑到 \((1,-1)\) 和 \((0,0)\) 关于 \(y=x-1\) 对称,感性理解一下,假设这些非法路径与 \(y=x-1\) 最后一次交于 \((i,i-1)\),那么把这条路径前面的部分沿 \(y=x-1\) 翻转以下,就能一一对应原来的所有不合法情况。容易算出这些非法路径方案数为 \(\binom{n-1+n+1}{n-1}=\binom{2n}{n-1}\),随后相减得出答案 \(\binom{2n}n-\binom{2n}{n-1}=\frac{2n!}{n!n!}-\frac{2n!}{(n-1)!(n+1)!}=(1-\frac{n}{n+1})\frac{2n!}{n!n!}=\frac1{n+1}\binom{2n}n\)。
定义
上述问题的答案被称作卡特兰数,记为 \(C_n\) 或 \(H_n\),满足:
对于卡特兰数,除上述通项公式外还有如下常用递推式:
以及上面推导过程中的作差式。
相关应用
这类问题通常可以转化为引入部分的网格图路径方案数计数。
-
一个无限大的栈,进栈序列为 \(1,2,3,\cdots,n\),则其有多少种不同种出栈序列?
这个比较好处理。根据栈的性质,容易想到 \(y=x\) 的限制在这里的实际意义是栈可为空且不弹空栈,则将进栈抽象为向上走,出栈抽象为向右走,就可以转为一般卡特兰数计数问题了。答案即为 \(C_n\)。
-
用 \(n\) 个 \(1\) 和 \(n\) 个 \(-1\) 组成长度为 \(2n\) 的序列 \(a_1,a_2,\cdots,a_{2n}\),求有多少种方案使得数列前缀和恒为非负整数。
-
有 \(2n\) 个人排队进剧场。入场费 \(5\) 元,\(n\) 个人只有有 \(5\) 元钞票,而剩下 \(n\) 人只有 \(10\) 元钞票,且售票处初始无零钱。问有多少种合理入场方式。
-
由 \(n\) 个无序节点可以构成多少个不同的二叉树?
这个问题等价于存在多少个有 \(n+1\) 个叶子节点的满二叉树。
一个比较好理解的组合意义是,枚举分配给左右子树的节点个数,然后将两边方案数乘起来求和。这一点实际上对应了上面的常用公式 \((1)\) 的 \(O(n^2)\) 递推式,虽然据说有一种转化为进栈问题的解法,但我不会,就不讲了。
-
在一个圆上有 \(2n\) 个点,将它们两两配对连线,求使这 \(n\) 条线段不相交的方法数。旋转视为相同。
比较经典的题,实际上与**问题 2 **有很大关系,但更像括号匹配?
由于不考虑旋转,故断环为链,钦定 \(1\) 为起点。则现在问题转化为两两配对使区间不交或包容。容易想到,这样的配对方式与合法括号序列一一对应,按照括号序的套路,问题转化为给 \(n\) 个数赋 \(1\) 其余赋 \(-1\),求使前缀和不为负数的方案数。然后没了,答案即为 \(C_n\)。
-
问在 \(n-1\) 条对角线不相交的情况下,将一个凸 \(n+2\) 边形分成不重叠三角形区域的方法数?
最为经典的题。首先由问题 5 得出:
引理 1 由 \(n\) 对括号组成的合法括号序个数为 \(C_n\)。
但是这道题中,点是可以重合的,而非纯纯配对问题,需要想想转化。
当然,这个解也可以看作 \(n+1\) 个数的不同相乘顺序数目,根据具体操作进而转化为有 \(n+1\) 个叶子节点的满二叉树个数。
(欸?好像知道了什么……这也就是:
引理 2 \(n+1\) 个数可以有 \(C_n\) 种不同相乘顺序。
如此一来,我们便可以得到一种非常妙的对应关系。
将原凸多边形的顶点按照逆时针标记为 \(1,2,\cdots,n+2\),并将与点 \(i\) 逆时针相邻的边赋值为 \(i\)。从点 \(1\) 开始逆时针遍历,与当前点相连的所有对角线,被访问过的记为右括号加入序列,未被访问过的记为左括号加入序列,在走边的时候则加入边权,如此一来便得到了一个相乘顺序。而注意到边 \(n+2\) 恰好在最末尾,可以忽略不计,因此所有连对角线方式与一个 \(n+1\) 个元素的相乘顺序形成单射,由引理 2 方法数总和为 \(C_n\)。
斯特林数
第二类斯特林数
似乎是因为第一类提的少用的少,所以把第二类放前面讲了。
第二类斯特林数,又称斯特林子集数,记为 \(S(n,k)\) 或 \(n\brace k\),表示将大小为 \(n\) 的集合划分为 \(k\) 个无区别非空集合的方案数。
递推式
考虑往大小为 \(n-1\) 的集合里面插入一个新的数,则有如下两种方案:
- 单独作为一个新集合,则集合数目在此加一,由 \(n-1\brace k-1\) 直接转移过来;
- 将这个数记入旧集合,显然集合数不变,用\(n-1\brace k\)乘上当前放置方案数即可。
通项公式
其实也是卷积形式。直接考虑二项式反演。假设有 \(n\) 个数,分成 \(i\) 个集合,记 \(G_i\) 为可以为空集的方案数,\(F_i\) 为不可以为空集的方案数。那么:
然后由于第二类斯特林数要求集合无序,将 \(F_n\) 除以 \(n!\) 就是答案了。或者也可以从一个很有组合意义的式子二项式反演得到:
不难看成 \(n\) 个球放 \(m\) 个盒子,枚举有几个盒子放就好了。同时,这个式子也是很有用的,对于一些要求 \(\mathcal{O}(k)\) 转移 \(f(S)^{k}\) 的毒瘤计数 DP 会用到,因为直接二项式定理会是 \(\mathcal{O}(k^{2})\),在北京集训笔记和做题记录里有提到。
第一类斯特林数
又称斯特林轮换数,如其名,把第一类斯特林数中的集合换成轮换即为定义,记为 \(n\brack k\)。轮换是一个首尾相接的排列,也就是说,它有顺序,但无相对顺序,有点抽象。
递推式
同样由组合意义证明。考虑新加一个数,有如下两种情况:
- 单开一个轮换,继承自 \(n-1\brack k-1\);
- 放到之前一个轮换中,注意到有序,故系数为 \(n-1\)。
然后没了。
重要应用
同行/同列斯特林数计算是多项式的,不管了。
阶乘幂
定义下降幂 \(x^{\underline n}=\frac{x!}{(x-n)!}=\prod_{k=0}^{n-1}(x-k) = \dbinom{n}{k} k!\)。那么从上上面的式子,有方幂到下降幂的转化式为:
同理存在上升幂转方幂为:
证明可以考虑从第二个式子入手,数学归纳。应该会整出个有趣的递推式:
斯特林反演
有没有发现方幂与阶乘幂的转化是单向的,那是因为证明需要一个叫斯特林反演的东东。
证明的前置芝士叫做反转公式:
考虑建立两种阶乘幂之间的关系。大眼观察可只,存在:
于是证完了一个反转公式,另一个同理可得。那么接下来的反演公式证明就是 trivial。当然,阶乘幂与方幂的转换也可以轻松证明。
上头整了个斯特林反演,把剩下的都记一下。实际上会注意到很多反演的证明都是展开……所以除了比较重要的证明,就只记式子了。
upd:发现还是有很多好用的推论的,也一并记上吧 qwq。
二项式反演
对于目标大小 \(n\),设 \(f(x)\) 为 \(x=n\) 的答案,\(g(x)\) 为 \(x\le n\) 的答案。
常用于容斥定理中。
莫比乌斯反演
莫比乌斯反演的本质:
I. 嵌入形式
II. 约数形式
III. 倍数形式
又作
通常还是有个上界的……
常用推论/式子:
- 单位函数,判别 \(\gcd\) 时可以用。在化简式子的时候可以把 \(\varepsilon\) 提到前面,这样原本用于 \(n\) 的求和计数就可以用除法代替了。
子集反演
对于目标集合 \(S\),设 \(f(T)\) 为 \(T=S\) 的答案,\(g(T)\) 为 \(T\subseteq S\) 的答案。
当 \(g\) 的定义刚好相反时,把 \(S,T\) 互换即可。
一些理解与技巧:
子集反演更像是二项式反演的一个特化版本,严谨的来说,\(\forall|S|=|T|: f_S=f_T\) 时子集反演的本质就是二项式反演。
一个常见推式子的技巧就是把子集贡献提到开头,这样剩下的部分就由不同变为相同,方便计算。同时,在反演的证明中,有一个感性理解很重要:
\(\sum_{R\sube T\sube S}(-1)^{|S|-|T|}=[R=S]\)。证明:
- 当 \(R=S\) 时,显然 \(\sum=(-1)^0=1\);
- 否则,考虑 \(R\) 以外若干元素(设有 \(k\) 个),任意钦定一个,那么对于剩下元素组成的 \(2^{k-1}\) 种状态,被钦定的元素都有选或不选两种,正好给集合带来 \(\pm1\) 的贡献,于是总和为 \(0\)
似乎可以用来理解 SOS-DP 和 FWT?
\(\min\)-\(\max\) 容斥
证明考虑普通容斥。重点在于,由于期望的线性性(即考虑这么计算期望:\(E(\max_{i \in S} x_{i}) = \sum_{y} P(x = y) \max_{j \in S} y_{j}\)),这个玩意儿在期望意义下成立:
\(k\)-th \(\max\)-\(\min\) 容斥:
单位根反演
证明考虑简单等比数列求和。用来求给定一个多项式,求特定倍数位上的系数和,也就是:
能用来证 IDFT 的正确性,虽然单位根反演就是从这里揪出来的。感觉没有优化时间复杂度?
拉格朗日反演
咕。
离散傅里叶变换
咕咕咕。
本文作者:年枫
本文链接:https://www.cnblogs.com/NianFeng/p/18678642
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步