求余求着求着就成0了
#include <bits/stdc++.h>
#define int long long
#define N 300001
#define mod 998244353
using namespace std;
void read(int& x) {
x = 0;
int f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x = x * f;
}
void write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
//////////////////////////////////////////////////
int n, m;
int hd[N];
int fm[N];
int to[N];
int cnt;
int po(int x, int p) {
int res = 1;
while (p) {
if (p & 1) res = res * x % mod;
x = x * x % mod;
p = p >> 1;
}
return res % mod;
}
void add(int x, int y) {
++cnt;
fm[cnt] = hd[x];
to[cnt] = y;
hd[x] = cnt;
}
int f[N][25];
int d[N];
void dfs(int u) {
for (register int i = 1; i <= 20; ++i) {
f[u][i] = f[f[u][i - 1]][i - 1];
}
for (int p = hd[u]; p; p = fm[p]) {
int v = to[p];
if (v != f[u][0]) {
f[v][0] = u;
d[v] = d[u] + 1;
dfs(v);
}
}
}
int lca(int x, int y) {
if (d[x] < d[y]) swap(x, y);
int c = d[x] - d[y];
for (register int i = 20; i >= 0; --i) {
if (c & (1 << i)) x = f[x][i];
if (x == y) return x;
}
for (register int i = 20; i >= 0; --i) {
if (f[x][i] != f[y][i]) {
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
int p[51][N];
void start() {
for (register int i = 1; i <= 50; ++i) {
for (register int j = 1; j <= n; ++j) {
p[i][j] = (p[i][j - 1] + po(j, i)) % mod;
}
}
}
signed main(void) {
read(n);
start();
for (register int i = 1; i <= n - 1; ++i) {
int x, y;
read(x); read(y);
add(x, y);
add(y, x);
}
dfs(1);
read(m);
while (m--) {
int x, y, k;
read(x); read(y); read(k);
int g = lca(x, y);
int ans = ((((p[k][d[x]] + p[k][d[y]]) % mod - p[k][d[f[g][0]]]) % mod - p[k][d[g]]) % mod + mod) % mod;
write(ans);
printf("\n");
}
return 0;
}