2024CCPC哈尔滨 L 题解
思路
首先可以发现这个期望其实是假的,我们只需要把所有方案的答案加起来,最后除以
我们先考虑一条路径的方案数:假设存在一条从
知道这个之后,我们可以考虑树形dp,由于
记
同时
这样处理完之后直接加到
考虑完转移,现在我们考虑如何计算答案,同样是
除此之外,
即两个端点不能都在同一个
到这里就把这道题解决了,更多细节见代码
代码
#include <bits/stdc++.h>
using i64 = long long;
constexpr int P = 998244353;
i64 power(i64 a, i64 b)
{
i64 res = 1;
for( ; b; b >>= 1, a = a * a % P)
if(b & 1) res = res * a % P;
return res;
}
void solve()
{
int n; std::cin >> n;
std::vector<std::vector<int>> adj(n);
for(int i = 1; i < n; i++)
{
int u, v; std::cin >> u >> v;
u--, v--;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
}
std::vector<i64> siz(n), siz2(n);
auto init = [&](auto init, int x, int fa) -> void
{
siz[x] = 1;
for(auto y : adj[x])
{
if(y == fa) continue;
init(init, y, x);
siz[x] += siz[y];
siz2[x] += siz[y] * siz[y];
}
};
init(init, 0, -1);
std::vector f(n, std::vector<i64>(3));
i64 ans = 0;
auto dfs = [&](auto dfs, int x, int fa) -> void
{
for(auto y : adj[x])
{
if(y == fa) continue;
dfs(dfs, y, x);
f[y][2] = (f[y][2] + 2 * f[y][1] + f[y][0]) % P;
f[y][1] = (f[y][1] + f[y][0]) % P;
for(int i = 0; i < 3; i++) f[y][i] = (f[y][i] + siz[y] * siz[y] - siz2[y]) % P;
i64 res = (f[y][0] * f[x][2] + f[y][2] * f[x][0] + 2 * f[y][1] * f[x][1]) % P;
i64 res2 = f[y][2] * ((n - siz[y]) * (n - siz[y]) - (siz2[x] - siz[y] * siz[y]) - (n - siz[x]) * (n - siz[x]));
ans = (ans + res + res2) % P;
for(int i = 0; i < 3; i++) f[x][i] = (f[x][i] + f[y][i]) % P;
}
};
dfs(dfs, 0, -1);
i64 inv = power(1LL * n * (n - 1) / 2 % P, P - 2);
ans = ans * inv % P * inv % P;
std::cout << ans << "\n";
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t; std::cin >> t;
while(t--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!