凭到哪点嘛??
查看原帖
凭到哪点嘛??
575755
nopic楼主2023/4/27 19:50
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
struct node {
	int next,to;
} edg[1000010];
int n,m,va[1000010][51],mi[1000010],head[1000010],vis[1000010],f[1000010][51],dept[1000010],cnt=0;
void add(int a,int b) {
	edg[++cnt].to=b;
	edg[cnt].next=head[a];
	head[a]=cnt;
}
void dfs(int now) {
	for(int i=head[now]; i; i=edg[i].next) {
		int v=edg[i].to;
		if(vis[v])
			continue;
		dept[v]=dept[now]+1;
		f[v][0]=now;
		vis[v]=1;
		for(int j=1; j<=50; j++) {
			f[v][j]=f[f[v][j-1]][j-1];
		}
		for(int j=1; j<=50; j++) {
			mi[j]=mi[j-1]*dept[v]%mod;
		}
		for(int j=1; j<=50; j++) {
			va[v][j]=(mi[j]+va[now][j])%mod;
		}
		dfs(v);
	}
}
int find(int a,int b) {
	if(a==b)
		return a;
	if(dept[a]<dept[b])
		swap(a,b);
	for(int i=50; i>=0; i--) {
		if(dept[f[a][i]]>=dept[b])
			a=f[a][i];
	}
	if(a==b)
		return a;
	for(int i=50; i>=0; i--) {
		if(f[a][i]!=f[b][i]) {
			a=f[a][i];
			b=f[b][i];
		} else
			continue;
	}
	return f[a][0];
}
//long long pp(int x,int y,int z) {
//	int p=find(x,y);
//	long long ans=0;
//	for(int i=dept[p]+1; i<=dept[x]; i++) {
//		long long q=1;
//		for(int j=1; j<=z; j++)
//			q=(q*(i-1))%mod;
//		ans=(ans+q)%mod;
//	}
//	for(int i=dept[p]; i<=dept[y]; i++) {
//		long long q=1;
//		for(int j=1; j<=z; j++)
//			q=(q*(i-1))%mod;
//		ans=(ans+q)%mod;
//	}
//	return ans;
//}
int main() {
	cin>>n;
	for(int i=1,x,y; i<=n-1; i++) {
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	memset(vis,0,sizeof(vis));
	dept[1]=1;
	vis[1]=1;
	mi[0]=1;
	dfs(1);
	cin>>m;
	for(int i=1,x,y,z; i<=m; i++) {
		cin>>x>>y>>z;
		int l=find(x,y);
		cout<<(va[x][z]+va[y][z]-va[l][z]-va[f[l][0]][z])%mod<<endl;
	}
	return 0;
}
2023/4/27 19:50
加载中...