0 pts 求调
查看原帖
0 pts 求调
817524
CR400BFAZ5254楼主2024/8/8 14:59
#include<bits/stdc++.h>
#define int long long
#define MOD 998244353
#define MAXN 300001
typedef long long ll;
using namespace std;
vector<int> e[MAXN];
ll f[MAXN][21],g[MAXN][51],dep[MAXN];
ll qpow(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1) ans=ll(ans*a)%MOD;
        a=ll(a*a)%MOD;
        b>>=1;
    }
    return ans;
}
void dfs(int x,int fa){
    f[x][0]=fa;
    dep[x]=dep[fa]+1;
    for(int j=0;f[x][j];j++){
        f[x][j+1]=f[f[x][j]][j];
    }
    for(int k=1;k<=50;k++){
        g[x][k]=(g[fa][k]+qpow(dep[x],k))%MOD;
    }
    for(auto v:e[x]){
        if(v!=fa){
            dfs(v,x);
        }
    }
}
void addedge(int x,int y){
    e[x].push_back(y);
    e[y].push_back(x);
}
int lca(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=0,d=dep[x]-dep[y];i<=20;i++){
        if(d&(1<<i)) x=f[x][i];
    }
    if(x==y) return x;
    for(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];
}
signed main(){
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        addedge(x,y);
    }
    dfs(1,0);
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int x,y,k;
        scanf("%d%d%d",&x,&y,&k);
        int z=lca(x,y);
        printf("%lld\n",((ll)g[x][k]-g[f[z][0]][k]+MOD+g[y][k]-g[z][k]+MOD)%MOD);
    }
    




    return 0;
}
2024/8/8 14:59
加载中...