小 C 在无向图上玩这样一个游戏。
小 C 可以任选一点作为起点。每次他可以进行两种操作:
- 移动到一个相邻的结点。
- 使用一次魔法,移动到图中任意一个结点。
当他访问图中每个结点至少 次时,游戏结束。注意他必须使用不超过 次魔法。
游戏结束时,如果他使用了 次魔法,则他本轮游戏的花费为 。
现有一个 个点 条边的无向连通图 。图 中任意一条边至多属于一个环。
小 C 希望知道,在图 的所有生成子图进行上述游戏所需花费的最小值之和。
由于答案可能很大,将答案对 取模。
Constraints
, ,
可能有重边,但不会有自环。
图 是图 的生成子图当且仅当 。
简单环定义为一个顶点序列 ,其中 与 相邻, 与 相邻,且 互不相同。
Solution
首先可以确定,在一个连通块内部移动不需要魔法,即只有跨越连通块使用的魔法是必要的,即最少魔法使用次数为连通块个数 。问题转换为,求出连通块个数为 的生成子图的方案数。
据题意,给出的图是仙人掌图,可以被分解为若干树边和环。我们将环和树边分开考虑,并构造出对应的生成函数, 表示当前部分贡献 个连通块的方案数,最后将得到的所有多项式相乘即可。
对于一条树边,删去即贡献 个连通块,保留则无贡献,即 。
对于一个包含n条边的环,在删去第一条边时无贡献,从第二条边开始每删去一条边对连通块数量贡献 ,即 。
在多项式相乘时使用启发式合并,保证时间复杂度为 。
在最后统计答案时,由于 序列不一定单调递增,一个连通块个数为 的生成子图的实际最小代价为后缀最小值。且因为初始连通块个数为 ,最终 的系数实际代表的是包含 个连通块的生成子图的方案数。
Code
1 |
|