零些二元函数
有标号边双计数(25.11.11)
设 \(f_{n, m}\) 表示 \(n\) 个点形成含 \(m\) 个点双的连通图的方案数。
\(g_n\) 表示 \(n\) 个点的连通图数量。\(g_n\) 容易通过容斥算出:
\(f_{n, 1}\) 可以通过容斥得到:
关键是计算 \(f_{n, m}\),其中 \(m \gt 1\)。圆方树建出来后,设这 \(m\) 个方点的子节点个数为 \(a_i\),那么这个点双内部的方案数就是 \(f_{a_i + 1, 1}\)。点双之间的连边,相当于有 \(m + 1\) 个连通块,大小为 \(1, a_1, a_2, \dots\)。直接连的方案数是 \(n^{m - 1} \times \prod a_i\)。由于我们不关心一个点双是哪一个节点连向父节点(即实际上是方点连出去的),所以方案数要除掉 \(\prod a_i\),也就是 \(n^{m - 1}\)。因此最终的式子就是:
可以通过辅助数组 \(h_{n, m} = \sum_{\sum a_i = n} \prod \frac{f_{a_i + 1, 1}}{a_i}\) 进行转移。最终可以在 \(O(n^3)\) 内解决。
有标号圆排列分组计数(斯特林数) (25.11.15)
设 \(S(n, m)\) 表示将 \(n\) 个互不相同的点划分成 \(m\) 个圆排列的方案。
法 \(1\)
考虑从 \(S(n - 1, *)\) 递推。对于第 \(n\) 个元素,其要么新开一个圆排列,要么插在前面的某个数的后面。因此可以得到转移式:
直接做就是 \(O(n^2)\) 的了。
假设要对固定的 \(n\),计算所有 \(S(n, m)\) 的值,那么策略就是将 \(S\) 写成生成函数 \(F_n\)。显然有:
分治乘法 \(O(n\log^2n)\),也有 \(O(n\log n)\) 的算法。
法 \(2\)
考虑 \(n\) 所在圆排列的大小 \(x\),那么可以得到:
利用前缀和优化即可做到 \(O(n^2)\)。
延续这个思路,容易得到一个圆排列的指数型生成函数为 \(\sum \frac{x^i}{i} = \ln(1 - x)\)。那么,我们可以对于固定的 \(m\),计算所有 \(S(n, m)\) 的值。即:
多项式快速幂即可。
定和二元函数容斥(2026.1.2)
标题是自己取的。
假设要求一类 \(f_{n, m}\),其中已知 \(\sum_m f_{n, m} = F(n)\) 并且比较好算,并且满足 \(f_{n, m}\) 是由 \(f_{i, 1}\) 进行类卷积得到的,那么可以在 \(O(n^3T(n))\) 解决,其中 \(T(n)\) 为卷积复杂度。
(其中 \(\prod\) 为自定义乘法)
例子:
- 有标号边双计数。
- P9799,双层析根析合树数量。即没有长度 \(\in (1, n)\) 的连续段的排列数量。
双层析根析合树数(2026.1.2)
标题还是自己取的。
一共有两个例外,\(n = 1, 2\),此时的根既是析点也是合点。
令 \(f_n\) 表示根不是合点,且根有 \(n\) 个子节点的析合树数量。特别定义 \(f_1 = 1, f_2 = 0\)。先计算根是合点的方案数。不妨假设这些子节点单调递增,那么对于第一个子节点,其代表的前缀不包含其他前缀在值域上也是前缀。设 \(p_n\) 表示所有真前缀在值域上都不事值域前缀的排列数量,那么:
因此根是合点的方案数就是 \(2\sum_{i=1}^{n - 1}p_i(n - i)! = 2(n! - p_n)\)。那么根节点不是合点的方案数为 \(2p_n - n!\)。
接下来计算析根有 \(i\) 个子节点的方案数 \(f(n, i)\)。只有 \(f(n, n)\) 是合法的,考虑容斥。
若不考虑这 \(i\) 个点之间的顺序,可以用一个 dp 解决。设 \(g(n, i)\) 表示将 \(n\) 个数拆成 \(i\) 个连续段的方案数:
那么 \(f(n, i) = f_i \times g(n, i)\)。\(f_i\) 充当了节点之间的顺序。
例题:P9799, P7278, P4566
q-binomial(2026.1.2)
定义 q-binomial:\([n]_q = \sum_{i=0}^{n - 1}q^i = \frac{1-q^n}{1-q}\),\([n]!_q = \prod_{i=1}^n [i]_q\),\({n \brack m}_q = \frac{[n]!_q}{[m]!_q[n-m]!_q}\)。
那么有一些性质:
-
\({n \brack m}_q = {n - 1 \brack m - 1} + q^m {n - 1 \brack m}\):
\[\begin{aligned} {n \brack m}_q &= \frac{\prod_{i=n - m + 1}^n (1 - q^i)}{\prod_{i=1}^m (1 - q^i)}\\ &= (1-q^n)\frac{\prod_{i=n - m + 1}^{n - 1} (1 - q^i)}{\prod_{i=1}^m (1 - q^i)}\\ &= (1 - {\color{red}q^m})\frac{\prod_{i=n - m + 1}^{n - 1} (1 - q^i)}{\prod_{i=1}^m (1 - q^i)} + ({\color{red} q^m} - q^n)\frac{\prod_{i=n - m + 1}^{n - 1} (1 - q^i)}{\prod_{i=1}^m (1 - q^i)}\\ &= {n - 1 \brack m - 1}_q + q^m{n - 1 \brack m}_q\\ \end{aligned} \]
它有一个组合意义:对于所有从 \((0, 0)\) 向右上走到 \((n - m, m)\) 的路径,设下方面积为 \(S\)(或者可以理解为长宽为 \(n - m, m\) 的杨表的面积),那么 \({n \brack m}_q\) 就是所有 \(q^S\) 的和。
它还有另一个意义,就是将 \(n - m\) 拆成 \(m\) 个数的和,假设为 \(a_1, \dots, a_m\),那么 \({n \brack m}_q\) 就是所有方法的 \(\prod q^{ia_i}\) 之和。这样,我们可以得到 q-二项式定理:
证明:
对于 \(x^m\) 项系数,其值等于 \(\sum_{0 \le i_1 \lt i_2 \lt \dots \lt i_m \lt n} \prod_{j=1}^m q^{i_j}\)。给 \(i_j\) 减去 \(j - 1\),即得系数为 \(q^{\binom m 2}\sum_{0 \le i_1 \le i_2 \le \dots \le i_m \le n - m}\prod_{j=1}^m q^{i_j}\)。右侧根据组合意义就是 \({n \brack m}_q\)。\(\square\)
这样我们就得到了一整行的生成函数。
不过,如果只是要求一整行的具体值的话,带入最初的定义就可以 \(O(1)\) 计算了。
应用题目:CF1603F


浙公网安备 33010602011771号