爆零,求助
#include<bits/stdc++.h>
#define MAXN 300005
#define ll long long
using namespace std;
struct edge{
int to,next;
}a[MAXN<<1];
int head[MAXN],deep[MAXN],tot,fa[MAXN][22];
int n,m,x,y,k,q[MAXN][55];
const int mod=998244353;
int ans,sum[MAXN][55];
void add(int x,int y)
{
a[++tot].to=y;
a[tot].next=head[x];
head[x]=tot;
}
void dfs(int now,int f)
{
fa[now][0]=f;
deep[now]=deep[f]+1;
for(int i=1;(1<<i)<=deep[now];++i)
{
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for(int i=head[now];i;i=a[i].next)
{
if(a[i].to==f)continue;
dfs(a[i].to,now);
}
}
int lca(int x,int y)
{
if(deep[x]<deep[y])swap(x,y);
for(int i=20;i>=0&&deep[x]>deep[y];--i)
{
if(deep[fa[x][i]]>=deep[y])x=fa[x][i];
}
if(x==y)return x;
for(int i=20;i>=0;--i)
{
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main()
{
scanf("%d",&n);
deep[0]=-1;
for(int i=1;i<=n;i++)
{
q[i][0]=1;sum[i][0]=1;
for(int j=1;j<=50;j++)
{
q[i][j]=(long long)q[i][j-1]*i%mod;
sum[i][j]=((long long)sum[i-1][j]+q[i][j])%mod;
}
}
for(int i=1;i<=n-1;++i)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
q[i][0]=1;sum[i][0]=1;
for(int j=1;j<=50;j++)
{
q[i][j]=(long long)q[i][j-1]*i%mod;
sum[i][j]=((long long)sum[i-1][j]+q[i][j])%mod;
}
}
dfs(1,0);
for(int i=1;i<=m;++i)
{
ans=0;
scanf("%d%d%d",&x,&y,&k);
int zu=lca(x,y);
ans=((long long)(sum[deep[x]][k]+sum[deep[y]][k] ) % mod - ( sum[deep[zu]][k]+sum[deep[zu]-1][k]) % mod + mod ) % mod;
printf("%d\n",ans);
}
return 0;
}