#include <bits/stdc++.h>
#define MOD 998244353
using namespace std;
vector<int> tree[300005];
int n, m, deep[300005], father[300005][20];
long long temp[300005], ans[300005][50];
void dfs(int x, int fa)
{
father[x][0] = fa;
if (x != 1) deep[x] = deep[fa] + 1;
if (!ans[x][2])
{
for (int i = 1; i <= 50; i++)
temp[i] = temp[i - 1] * deep[x] % MOD;
for (int i = 1; i <= 50; i++)
ans[x][i] = (ans[fa][i] + temp[i]) % MOD;
}
for (int i = 1; i <= 19; i++)
father[x][i] = father[father[x][i - 1]][i - 1];
for (int i = 0; i < tree[x].size(); i++)
{
int now = tree[x][i];
if (now != fa) dfs(now, x);
}
}
int LCA(int u, int v)
{
if (deep[u] > deep[v]) swap(u, v);
for (int i = 19; i >= 0; i--)
if (deep[father[u][i]] >= deep[v])
u = father[u][i];
if (u == v) return u;
for (int i = 19; i >= 0; i--)
if (father[u][i] != father[v][i])
u = father[u][i], v = father[v][i];
return father[u][0];
}
int main()
{
cin >> n;
for (int i = 1; i < n; i++)
{
int x, y;
cin >> x >> y;
tree[x].push_back(y);
tree[y].push_back(x);
}
cin >> m;
temp[0] = 1;
dfs(1, 0);
while (m--)
{
int i, j, k;
cin >> i >> j >> k;
int nearfather = LCA(i, j);
cout << (ans[i][k] + ans[j][k] + 2 * MOD - ans[nearfather][k] - ans[father[nearfather][0]][k]) % MOD << endl;
}
return 0;
}
参考第一篇题解写的。。。全WA。。。QWQ