零些二元函数
有标号边双计数(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)\) 的值。即:
多项式快速幂即可。


浙公网安备 33010602011771号