UOJ Logo hehezhou的博客

博客

详细揭秘怎样用数数技巧爆算 #138

2021-11-19 10:45:14 By hehezhou

写这篇博客的起因是校内模拟赛出重了。。然后 chenkuowen 用集合幂级数通过了,大为震撼。

首先对原图进行收缩,具体的,我们给每条边设置两个边权 $c, d$ 分别表示使这条边联通的方案数和使这条边断开的方案数,初始有边即为 $(1,1)$。

收缩含有三部分:缩一度点,缩二度点,叠合重边。

  1. 缩一度点:删去这个点,并在答案上乘上 $c$。

  2. 缩二度点:删去这个点,并合并两条边,具体的,$(c,d)=(c_ac_b,c_ad_b+d_ac_b)$。

  3. 叠合重边:合并两条边,具体的,$(c,d)=(c_ac_b+c_ad_b+d_ac_b,d_ad_b)$。

做完以上操作后,每个点至少是三度点,并且 $m-n$ 不会增大。于是我们有 $m\geq \frac{3n}{2},m\leq n+k-1$,那么 $n\leq 2k-2$。

接下来考虑如何计算使这张图联通的方案数。

设 $f_S$ 表示点集 $S$ 的导出子图的联通生成子图个数,$g_S$ 表示点集 $S$ 的导出子图的生成子图个数。

那么

$$g_S=\sum_{\{P_k\}\in \text{part}(S)}\prod_{i=1}^k f_{P_i}\prod_{u\in P_i,v\in P_j,i\lt j} d_{u,v}$$

其中 $\{P_k\}\in \text{part}(S)$ 表示 $\{P_k\}$ 是 $S$ 的一个无序划分。

再设 $D_S=\prod_{u,v\in S} d_{u,v}$,那么有

$$\frac{g_S}{D_S}=\sum_{\{P_k\}\in \text{part}(S)}\prod_{i=1}^k \frac{f_{P_i}}{D_{P_i}}$$

注意如果有 $d_{u,v}=0$ 需要特殊处理(直接合并两个点)。

令 $G_S=\frac{g_S}{D_S},F_S=\frac{f_S}{D_S}$,上述式子实际上就是 $G=\sum_{i=0}\frac{F^i}{i!}=\exp(F)$。

所以 $F=\ln(G)$,注意到 $g_S=\prod_{u,v\in S} (c_{u,v}+d_{u,v})$,于是可以快速计算出 $F$。

时间复杂度 $\Theta(n+k^24^k)$。

评论

negiizhao
我一直以为这是标准做法……)
Itst
感觉我在远古联测里面看见过问染色方案数的
EntropyIncreaser
其实我还挺喜欢看到一些把远古题拿来加强的计划的() 感觉这条路还可以继续往下走走,因为这个图依然比较稀疏。如果有相邻的 $3$ 度点,我们可以枚举那条临边是选还是不选,这样就能递归到 $(n-2,m-3)$ 和 $(n-1,m-1)$ 两个子问题。当不存在相邻的三度点时,有 $m\ge \frac{12}7n$。有上界 $T(m) = T(m-1) + T(m-3) + O(2^{\frac{7}{12}m}m^2)$,主定理解出 $T(m)=O(2^{\frac{7}{12}m} m^2)$,由于 $m \le 3k$,有上界 $O(3.3636^k)$。 其实感觉有三度点就递归的话肯定是更优的,但是我没算出来更好的上界,欢迎有人继续改进。
vfleaking
啊这,好像是吉老师的UER题,而且这场UER好像是我组的题?远古 vfk 流下泪水 (划重点:Easy Round)

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。