NOI22联考 sdsz 数数 / NOI25联考 sdsz 基环

设原图有 \(k\) 个连通块,大小分别为 \(s_1, s_2, \dots, s_k\)

先考虑原图已经存在一个环怎么做,发现答案直接就是 \(\left(\prod\limits_{i=1}^{k}s_i\right)\cdot n^{k-2}\)(可能需要特判掉 \(k=1\))。

扩展 \(Caylay\) 公式

考虑 \(pr\ddot{u}fer\) 序列,其还原出的点 \(u\) 度数为序列上 \(u\) 的出现次数 \(+1\)。我们知道当每个连通块度数都确定时,方案数为 \(\prod\limits_{i=1}^ks_i^{deg_i}\)

考虑先给每个连通块 \(\prod\limits_{i=1}^{k}s_i\) 的贡献,第 \(i\) 位有 \(k\) 种选择,第 \(j\) 个选择的贡献是 \(s_j\),第 \(i\) 位总贡献即 \(n\)。各位独立,故把若干个连通块连成树的方案数即 \(\left(\prod\limits_{i=1}^{k}s_i\right)\cdot n^{k-2}\)

对于原图不存在环的情况,先特判掉 \(k=1\),然后考虑先连若干条边构成使图中出现一个环,然后化为上面的情况。

新环有两种可能,只经过原来的一个连通块或者经过多个。

对于只经过原来一个连通块的情况,对每一个连通块 \(i\),计算连边方案数(\(\frac{s_i(s_i-1)}{2}-|E_i|\)\(|E_i|\) 为连通块内原图中边的数量),再乘以 \(\left(\prod\limits_{i=1}^{k}s_i\right)\cdot n^{k-2}\),因此这种情况共对答案产生的贡献为

\[\left(\sum\limits_{i=1}^k\left(\frac{s_i*(s_i-1)}{2}-|E_i|\right)\right)\cdot\left(\prod\limits_{i=1}^{k}s_i\right)\cdot n^{k-2} \]

对于环经过原来多个连通块的情况,假设经过了 \(p_1,p_2,\dots,p_c\)(无序),则发现答案变为

\[\frac{\sum\limits_{i=1}^cs_{p_i}}{\prod\limits_{i=1}^cs_{p_i}}\cdot\frac{c!}{2c}\cdot\left(\prod\limits_{i=1}^{k}s_i\right)\cdot n^{k-c-1} \]

发现 \(\frac{c!}{2c}\cdot\left(\prod\limits_{i=1}^{k}s_i\right)\cdot n^{k-c-1}\) 只与 \(c\) 有关,所以考虑把前面的项乘以连边方案数(使用乘法原理不难发现为 \(\prod\limits_{i=1}^cs_{p_i}^2\))后用dp计算。

\[f_{i,j}=\sum\limits_{c=j\atop p_1,\dots p_c\leq i}\left(\prod\limits_{i=1}^cs_{p_i}^2\cdot\frac{\sum\limits_{i=1}^cs_{p_i}}{\prod\limits_{i=1}^cs_{p_i}}\right) \]

\[f_{i,j}=\sum\limits_{c=j\atop p_1,\dots p_c\leq i}\left(\prod\limits_{i=1}^cs_{p_i}\cdot\sum\limits_{i=1}^cs_{p_i}\right) \]

转移需要记一个 \(g\),表示

\[g_{i,j}=\sum\limits_{c=j\atop p_1,\dots p_c\leq i}\prod\limits_{i=1}^cs_{p_i} \]

稍微拆一下,就会发现转移为

\[f_{i,j}\leftarrow f_{i-1,j}+f_{i-1,j-1}\cdot s_i+g_{i-1,j-1}\cdot s_i^2 \]

\[g_{i,j}\leftarrow g_{i-1,j}+g_{i-1,j-1}\cdot s_i \]

现在已经能处理绝大多数情况了,但是发现 \(c=2\)\(c=k\) 的情况还是不对,分讨一下:

  1. \(c=2\) 在连边方案中减掉重边方案数 \(s_i\cdot s_j\),即将 \(f_{n,2}\) 减去 \(\sum\limits_{i<j}s_is_j\cdot\frac{s_i+s_j}{s_is_j}=\sum\limits_{i<j}(s_i+s_j)=n(k-1)\),贡献到答案即可。

  2. \(c=k\) 发现贡献变为 \(\prod\limits_{i=1}^ks_i^2\cdot\frac{k!}{2k}\),预处理这个式子(也可以记一个 \(h_{i,j}\) 然后dp),贡献到答案即可。

  3. \(c=k=2\) 发现贡献变为 \(\left(\prod\limits_{i=1}^ks_i^2-\prod\limits_{i=1}^ks_i\right)\cdot\frac{k!}{2k}\),将 \((h_{k,k}-g_{k,k})\cdot\frac{k!}{2k}\) 贡献到答案即可

把上述两种情况贡献加起来,特殊处理一下边界就行了。

关于优化,可以写出 \(f_{i,j},g_{i,j}\) 的生成函数 \(F_i(x),G_i(x)\),转移写成多项式是简单的,用矩阵维护多项式,转移矩阵内部是短多项式,分治ntt即可

posted @ 2025-11-24 16:24  SmpaelFx  阅读(6)  评论(0)    收藏  举报