Tips:本题解由豆包AI辅助生成,请酌情选择
问题分析与解题思路
1. 核心概念
等价类:本质是计算不同的 "本质不同" 的放置方式,这些方式无法通过奶牛移动互相转化。
树的结构分解:树中度数≠2 的节点是 "关键点"(分支点 / 叶子),度数 = 2 的节点是 "链节点"。链节点不影响等价性(奶牛可在链上自由移动),只有关键点的放置才决定等价类。
2. 解题步骤
步骤 1:预处理阶乘与逆元
计算阶乘ans[i] = i! mod P(豆包tips:初始 ans 数组存储阶乘)
计算阶乘的逆元ifac[i] = (i!)^{-1} mod P(豆包tips:运用费马小定理:逆元 = pow (i!, P-2, P))
步骤 2:树的结构分解
找出所有度数≠2 的节点作为 "根节点"(豆包tips:存入 set<root>)
对每个根节点,DFS 遍历其所在的链,记录根节点到其他根节点的链长度(边数)
将所有连接两个根节点的链按长度从大到小排序
步骤 3:并查集合并与计数
按链长度从小到大处理,用并查集合并根节点 (豆包的tips:反向遍历)
对于每个 K,计算等价类数量:等价类数 = (总排列数) / (等价变换数),模意义下用逆元实现除法
代码详解