样例过蛋Wa0求条
查看原帖
样例过蛋Wa0求条
373530
Reply_楼主2024/9/20 20:44
#include<bits/stdc++.h>
#define int long long
#define R register
#define F(i,a,b) for(int i = (a);i<=(b);i++)
using namespace std;
inline int read(){R int x=0,t=1;R char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*t;}
const int N=3e5+10,mod=998244353;
int n,dep[N],fa[N],siz[N],top[N],id[N],w[N],q[N][55],son[N],tot;
vector<int>g[N];
int ksm(int x,int y)
{
	int ans=1;
	while(y){
		if(y&1){
			ans*=x;
			ans%=mod;
		}
		x*=x;
		x%=mod;
		y/=2;
	}
	return ans;
}
inline void init(int l,int r)
{
	F(j,1,50)
	F(i,l,r) q[i][j]=(q[i-1][j]+ksm(w[i],j))%mod;
}
inline int query(int k,int l,int r)
{
	return (q[r][k]-q[l-1][k])%mod;
}
void dfs1(int u,int Fa)
{
	dep[u]=dep[Fa]+1;
	fa[u]=Fa;
	siz[u]=1;
	for(int i = 0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==Fa) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
	return;
}
void dfs2(int u,int topf)
{
	id[u]=++tot;
	w[tot]=dep[u];
	top[u]=topf;
	if(!son[u]) return;
	dfs2(son[u],topf);
	for(int i = 0;i<g[u].size();i++){
		int v=g[u][i];
		if(id[v]) continue;
		dfs2(v,v);
	}
	return;
}
inline int qRange(int u,int v,int k)
{
	int ans=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans+=query(k,id[top[u]],id[u]);
		ans%=mod;
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	ans+=query(k,id[u],id[v]);
	ans%=mod;
	return ans;
}
signed main()
{
	n=read();
	F(i,2,n){
		int ui=read(),vi=read();
		g[ui].push_back(vi);
		g[vi].push_back(ui);
	}
	dep[0]=-1;
	dfs1(1,0);
	dfs2(1,1);
	init(1,n);
	int m=read();
	F(i,1,m){
		int ui=read(),vi=read(),k=read();
		cout << qRange(ui,vi,k)%mod << '\n';
	}
	return 0;
}

2024/9/20 20:44
加载中...