1 条题解
-
0
题意理解
我们有一棵 个节点的树,要给每条边染上 种颜色之一。给定 条路径(由节点对确定),要求每条路径都是“多彩的”,即路径上的边至少包含两种不同的颜色。求满足条件的染色方案数,对 取模。
数据范围:,, 可以很大(最多 )。
核心思路:容斥原理
问题转化 直接计算所有路径都多彩的方案比较困难,我们考虑用容斥原理。
设第i条路径是单色为一个坏事件。我们要求的是:
ans = 总方案数 - 至少一条路径单色的方案数 + 至少两条路径单色的方案数 - 至少三条路径单色的方案数 + ...
用容斥原理表达:
ans = 对所有路径子集S求和:(-1)的S大小次方 × F(S)
其中F(S)表示让集合S中所有路径都是单色的染色方案数。
计算
关键观察:如果 中所有路径都是单色的,那么这些路径覆盖的边集 中,每个连通分支必须染同一种颜色。
证明:
- 如果两条边在 中连通,那么它们必须同色(因为存在路径同时包含它们,且该路径是单色的)
- 因此 的每个连通分支内部颜色相同
- 不同连通分支之间颜色选择独立
设 形成 个连通分支,则: [ F(S) = k^{,c(S)} ] 因为每个连通分支可以独立选择 种颜色之一。
算法步骤
1. 预处理路径边集
对于每条路径 (端点 ):
- 找到路径上的所有边
- 可以用 DFS 或 LCA 实现
- 存储为位掩码或布尔数组
2. 枚举子集
由于 ,可以枚举所有 个子集:
- 用二进制位表示每条路径是否在 中
- 对每个 ,计算边集并集
3. 计算连通分支数
对每个 :
- 取 中所有路径的边集并集
- 用并查集或 DFS 计算 的连通分支数
4. 容斥计数
对每个子集 :
- 计算贡献
- 累加到答案中
- 所有运算对 取模
5. 快速幂
由于 可能很大(),计算 需要用快速幂。
复杂度分析
- 预处理: 或 ,用于找出所有路径的边集
- 主算法:
- 枚举 个子集
- 对每个子集,用并查集计算连通分支数()
- 总体:,在 , 时可行
总结
本题是容斥原理的经典应用:
- 将"所有路径都多彩"转化为"至少一条路径单色"的补集
- 利用路径单色意味着边集连通分支同色的性质
- 通过枚举子集和计算连通分支数实现容斥
这种方法在 较小时非常有效,是处理"多个条件同时满足"计数问题的通用技巧。
- 1
信息
- ID
- 3137
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 1
- 上传者