全WA 看不出问题TAT
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
#define Max 500005
#define rep(i, a, b) for(register int i = a;i <= b;i++)
#define brep(i, a, b) for(register int i = b;i >= a;i--)
int pre[Max], cnt, n, m, dp[Max][29], dep[Max] = {-1}, sum[Max][51];
struct edge{
int to, next;
}g[Max];
void add(int u, int v)
{
g[++cnt].to = v;
g[cnt].next = pre[u];
pre[u] = cnt;
}
void dfs(int u, int fa)
{
dep[u] = dep[fa]+1;dp[u][0] = fa;
rep(i, 1, 28)dp[u][i] = dp[dp[u][i-1]][i-1];
int res = 1;
rep(i, 1, 50)
{
res *= dep[u];res %= mod;
sum[u][i] = sum[fa][i]+res;
sum[u][i] %= mod;
}
for(int i = pre[u];i;i = g[i].next)
{
int v = g[i].to;
if(v != fa)dfs(v, u);
}
}
int lca(int u, int v)
{
if(dep[u] < dep[v])swap(u, v);
brep(i, 0, 28)
if(dep[dp[u][i]] >= v)
u = dp[u][i];
if(u == v)return v;
brep(i, 0, 28)
if(dep[dp[u][i]] != dep[dp[v][i]])
{
u = dp[u][i];
v = dp[v][i];
}
return dp[v][0];
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n;
rep(i, 1, n-1)
{
int u, v;
cin >> u >> v;
add(u, v);
}
dfs(1, 0);
int a, b, k;
cin >> m;
rep(i, 1, m)
{
cin >> a >> b >> k;
int x = lca(a, b);
cout << ((sum[a][k]-sum[x][k]+sum[b][k]-sum[dp[x][0]][k])%mod+mod)%mod << endl;
// 1.a -> x 2.x -> b
}
return 0;
}