- 发现所有长度相同的简单路径的权值可能情况相同,且最长的简单路径长度为 \(O(\log n)\) 级别,考虑维护所有长度的简单路径在一棵树上出现的次数,每种简单路径的权值在所有树上出现的次数,相乘即使答案。
- 我们考虑长度为 \(x\) 的路径对答案的贡献,考虑枚举这条路径的贡献 \(k\) ,让一个路径的最大值恰好 \(= k\) 是困难的,因此我们考虑容斥。及让一个路径的 \(\max \leq k\) ,然后再做一个差分即可得到恰好 \(= k\) 的答案。方案数显然为 \(m^{n-x} \sum\limits_{k=1}^{m} k(k^x-(k-1)^x)\) ,其中求和中 \(\times k\) 是因为这条路径的权值为 \(k\)
- 第二步要做的是统计各个长度的路径个数。完全二叉树以低复杂度 dp 是困难的,故我们先假设原树是一个满二叉树。容易想到设 \(f_{i,j}\) 表示以深度为 \(i\) 的满二叉树,长度为 \(j\) 的路径个数, \(g_{i,j}\) 表示深度为 \(i\) 的满二叉树,以根为起点长度为 \(j\) 的路径个数。容易得到转移:
- 然后我们要怎么解决完全二叉树的问题呢?这里有一个比较重要的性质:一个完全二叉树内本质不同的子树只有 \(O(\log n)\) 个。证明就考虑对于一个节点,对于他的两个儿子,肯定一个是完全二叉树一个是满二叉树。因此我们不停递归是完全二叉树的儿子直至到达叶子节点,经过的路径长度显然是树高,即 \(O( \log n)\)
- 因此我们只需要在 dfs 过程中合并两个结果即可
- 小 tips : 求一个树是否为满二叉树可以判断这个树 一直往左走的次数 是否等于 一直往右走的次数,这么判断复杂度是 \(O( \log n)\) 的
- 小 tips2 : 计算 \(f_{i,j}\) 和 \(g_{i,j}\) 可以预处理
- 小 tips3 : 计算幂时可以不用快速幂,而是把要用到的提前预处理好
- 最终复杂度 \(O(m \log n + T \log^3 n)\)
- 小 tips4 : 貌似还可以继续优化:
- 倍增求深度的话一个 \(O( \log n)\) 会变成 \(O( \log \log n)\) ,这很小,可以当成常数
- 计算 \(f_{i,j}\) 这个式子好像可以用多项式优化(我也不会 QwQ)