rt,样例过了。
#include <bits/stdc++.h>
#define N 600005
#define mod 998244353
typedef long long LL;
LL head[N], tail[N], nxt[N], tot;
inline void add_edge (LL u, LL v) {
tail[++tot] = v;
nxt[tot] = head[u];
head[u] = tot;
}
LL dep[N], f[N][25], F[N][50];
LL n, m;
inline LL pow (LL x, LL y) {
LL res = 1;
while (y) {
if (y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res % mod;
}
inline void dfs (LL x, LL fa) {
for (LL i = 1; i <= 50; ++i) {
F[x][i] = (F[fa][i] + pow (dep[x], i) + mod) % mod;
}
for (LL i = head[x]; i; i = nxt[i]) {
LL ed = tail[i];
if (ed != fa) {
dep[ed] = dep[x] + 1;
f[ed][0] = x;
for (LL j = 1; j <= log2(n); ++j) {
f[ed][j] = f[f[ed][j - 1]][j - 1];
}
dfs (ed, x);
}
}
}
inline LL LCA (LL u, LL v) {
if (dep[u] < dep[v]) std::swap (u, v);
for (LL i = log2(n); i; --i) {
if (dep[f[u][i]] >= dep[v]) u = f[u][i];
}
if (u == v) return v;
for (LL i = log2(n); i; --i) {
if (f[u][i] != f[v][i]) u = f[u][i], v = f[v][i];
}
return f[u][0];
}
int main() {
std::cin >> n;
for (LL i = 1; i < n; ++i) {
LL u, v;
std::cin >> u >> v;
add_edge (u, v);
add_edge (v, u);
}
dep[0] = -1;
dfs (1, 0);
std::cin >> m;
while (m--) {
LL i, j, k;
std::cin >> i >> j >> k;
LL lca = LCA (i, j);
LL ans1 = (F[i][k] + F[j][k] + mod) % mod;
LL ans2 = (F[lca][k] + F[f[lca][0]][k] + mod) % mod;
std::cout << ((ans1 - ans2) + mod) % mod << '\n';
}
return 0;
}