零些二元函数

有标号边双计数(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} \]

多项式快速幂即可。

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