零些二元函数

有标号边双计数(25.11.11)

\(f_{n, m}\) 表示 \(n\) 个点形成含 \(m\) 个点双的连通图的方案数。

\(g_n\) 表示 \(n\) 个点的连通图数量。\(g_n\) 容易通过容斥算出:

\[g_n = 2^{\binom{n}{2}} - \sum_{i=1}^{n - 1} \binom{n - 1}{i - 1} \times g_i \times 2^{\binom{n - i}{2}}\\ \]

\(f_{n, 1}\) 可以通过容斥得到:

\[f_{n, m} = g_n - \sum_{i=2}^n f_{n, i} \]

关键是计算 \(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}\)。因此最终的式子就是:

\[\begin{aligned} f_{n, m} &= \sum_{a_1 + \dots + a_m = n - 1} \frac{1}{m!} \times \binom{n - 1}{a_1, \dots, a_m} n^{m - 1} \prod_{i=1}^m f_{a_i + 1, 1}\\ &= \frac{n^{m - 1}(n-1)!}{m!} \sum_{a_1 + \dots + a_m = n - 1} \prod_{i=1}^m \frac{f_{a_i + 1, 1}}{a_i!} \end{aligned} \]

可以通过辅助数组 \(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\) 个元素,其要么新开一个圆排列,要么插在前面的某个数的后面。因此可以得到转移式:

\[S(n, m) = S(n - 1, m - 1) + (n - 1) \times S(n - 1, m) \]

直接做就是 \(O(n^2)\) 的了。

假设要对固定的 \(n\),计算所有 \(S(n, m)\) 的值,那么策略就是将 \(S\) 写成生成函数 \(F_n\)。显然有:

\[\begin{aligned} F_n(x) &= (n - 1)F_{n - 1}(x) + x F_{n - 1}(x)\\ &= (n + x - 1) F_{n - 1}(x)\\ &= x^{\overline{n}} \end{aligned} \]

分治乘法 \(O(n\log^2n)\),也有 \(O(n\log n)\) 的算法。

\(2\)

考虑 \(n\) 所在圆排列的大小 \(x\),那么可以得到:

\[\begin{aligned} S(n, m) &= \sum_{x=1}^n \binom{n - 1}{x - 1} (x-1)! S(n - x, m)\\ S(n, m) &= \sum_{x=1}^n \frac{(n-1)!}{(n-x)!} S(n - x, m)\\ n \times \frac{S(n, m)}{n!} &= \sum_{x=1}^n \frac{S(n - x, m)}{(n-x)!}\\ \end{aligned} \]

利用前缀和优化即可做到 \(O(n^2)\)

延续这个思路,容易得到一个圆排列的指数型生成函数为 \(\sum \frac{x^i}{i} = \ln(1 - x)\)。那么,我们可以对于固定的 \(m\),计算所有 \(S(n, m)\) 的值。即:

\[\begin{aligned} F_m(x) &= (\ln(1-x))^m\\ \end{aligned} \]

多项式快速幂即可。

定和二元函数容斥(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)\) 为卷积复杂度。

\[f_{n, 1} = F(n) - \sum_{m \ge 2} f_{n, m}\\ f_{n, m} = \prod_{\sum a_i = m} f_{a_i, 1} \]

(其中 \(\prod\) 为自定义乘法)

例子:

  • 有标号边双计数。
  • P9799,双层析根析合树数量。即没有长度 \(\in (1, n)\) 的连续段的排列数量。

双层析根析合树数(2026.1.2)

标题还是自己取的。

一共有两个例外,\(n = 1, 2\),此时的根既是析点也是合点。

\(f_n\) 表示根不是合点,且根有 \(n\) 个子节点的析合树数量。特别定义 \(f_1 = 1, f_2 = 0\)。先计算根是合点的方案数。不妨假设这些子节点单调递增,那么对于第一个子节点,其代表的前缀不包含其他前缀在值域上也是前缀。设 \(p_n\) 表示所有真前缀在值域上都不事值域前缀的排列数量,那么:

\[p_n = n! - \sum_{i=1}^{n - 1}p_i(n - i)! \]

因此根是合点的方案数就是 \(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\) 个连续段的方案数:

\[g(n, i) = \sum_{j} g(n - j, i - 1) \times j! \]

那么 \(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-二项式定理

\[\prod_{i=0}^{n - 1} (1 + q^ix) = \sum_{m=0}^n x^mq^{\binom m 2}{n \brack m}_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

posted @ 2025-11-11 14:52  cosf  阅读(9)  评论(0)    收藏  举报