萌新求助全WA,然而负数处理了得
查看原帖
萌新求助全WA,然而负数处理了得
461616
Judgelight楼主2022/12/19 08:36
#include<bits/stdc++.h>
#define int long long
#define N 300009
#define M 600009
using namespace std;
const int mod=998244353;
int n,m,he[N],cnt,fa[N][32],depth[N],sum[N][59],lg[N];
struct Node{
	int ne,to;
}e[M];
void add(int u,int v){
	e[++cnt].ne=he[u];
	e[cnt].to=v;
	he[u]=cnt;
}
int ksm(int a,int b){
	if(b==0){
		return 1ll;
	}
	int now=ksm(a,b/2);
	if(b%2==1){
		return now*now%mod*a%mod;
	}
	return now*now%mod;
}
inline void init(){
	for(int i=1;i<=n;i++){
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	}
}
void dfs(int u,int from){
	fa[u][0]=from;
	depth[u]=depth[from]+1;
	for(int i=1;i<=50;i++){
		sum[u][i]=sum[from][i]+ksm(depth[u],i);
		sum[u][i]=(sum[u][i]%mod+mod)%mod;
	}
	for(int i=1;i<=lg[depth[u]];i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int i=he[u];i;i=e[i].ne){
		int v=e[i].to;
		if(v==from){
			continue;
		}
		dfs(v,u);
	}
}
int lca(int u,int v){
	if(depth[u]<depth[v]){
		swap(u,v);
	}
	while(depth[u]>depth[v]){
		u=fa[u][lg[depth[u]-depth[v]]-1];
	}
	if(u==v){
		return u;
	}
	for(int i=lg[depth[u]];i>=0;i--){
		if(fa[u][i]!=fa[v][i]){
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x); 
	}	
	depth[0]=-1;
	dfs(1,0);
	cin>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		cout<<(sum[x][z]+sum[y][z]-sum[lca(x,y)][z]%mod+mod)%mod<<endl;
	}
	return 0;
}
2022/12/19 08:36
加载中...