怀疑人生,发发爆零。
查看原帖
怀疑人生,发发爆零。
590609
jiangjiangQwQ楼主2023/10/1 17:46
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
#define int long long
#define re register
#define For(i,l,r) for(re int i=l;i<=r;i++)
#define Rep(i,l,r) for(re int i=l;i>=r;i--)
#define ls(c) c<<1
#define rs(c) c<<1|1
const int N=3e5+5;
const int p=998244353;
inline void fast(){
	   ios::sync_with_stdio(false);
	   cin.tie(0);cout.tie(0);
}
inline void read(int &x){
	   x=0;int f=1;
	   char c=getchar();
	   while(!isdigit(c)){
			if(c=='-') f=-1;
			c=getchar();
	   }while(isdigit(c)){
			x=x*10+c-'0';
			c=getchar();
	   }x*=f;
}
inline void write(int x){
	   if(x<0){x=-x;putchar('-');}
	   if(x>9) write(x/10);
	   putchar(x%10+'0');
}
int n,m;
int u,v,k;
vector<int> edge[N<<2];
int dep[N],size[N],fa[N],sum[N][51];
int son[N],id[N],top[N],cnt;
int power(int x,int y){
	int res=1;
	while(y){
		if(y&1) res*=x%p;
		x*=x%p;
		y>>=1;
	}return res%p;
}
inline void dfs1(int u,int faz){
	fa[u]=faz;
	size[u]=1;
	dep[u]=dep[faz]+1;
	for(int i=0;i<=50;i++){
		sum[u][i]=(sum[faz][i]%p+(int)(pow(dep[u]-1,i))%p)%p;
	}
	for(int j=0;j<edge[u].size();j++){
		int v=edge[u][j];
		if(v==faz) continue;
		dfs1(v,u);
		size[u]+=size[v];
		if(size[son[u]]<size[v]) son[u]=v;
	}
}inline void dfs2(int u,int head){
	top[u]=head;
	id[u]=++cnt;
	if(son[u]) dfs2(son[u],head);
	for(int j=0;j<edge[u].size();j++){
		int v=edge[u][j];
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
}int lca(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}if(dep[x]<dep[y]) return x;
	return y;
}
signed main(){
	fast();
	cin>>n;
	For(i,1,n-1){
		cin>>u>>v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
//	dep[0]=1;
	dfs1(1,0);
	dfs2(1,1);
	cin>>m;
	while(m--){
		cin>>u>>v>>k;
		int lca_=lca(u,v);
		int ans = ((sum[u][k] + sum[v][k]) % p - (sum[lca_][k] + sum[fa[lca_]][k]) % p + p) % p;
		cout<<ans<<'\n';
	}
	return 0;
}

2023/10/1 17:46
加载中...