Unaccepted的100分,被hack数据阴了,救命
查看原帖
Unaccepted的100分,被hack数据阴了,救命
1776938
Lucian2007楼主2025/8/2 09:26
#include<bits/stdc++.h>
using namespace std;
const int N=6e5;
const int mod=998244353;
int n,m,t,tot=0;
int f[N][20],d[N],ver[2*N],Next[2*N],head[N];
queue<int>q;

// 快速幂:a^b mod mod
long long p(long long a,int b) 
{
    long long r=1;
    a%=mod;
    while(b)
	{
        if(b&1) r=r*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return r;
}

void add(int x,int y)
{
	ver[++tot]=y;//表示边的的终点
	Next[tot]=head[x];//指针,指向下一条边的索引
	head[x]=tot;//指向x的第一条边
}

void bfs()
{
	memset(d,-1,sizeof(d));
	q.push(1);
	d[1]=0;
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=Next[i])
		{
			int y=ver[i];
			if(d[y]==-1) 
			{
			d[y]=d[x]+1;
			f[y][0]=x;
			for(int j=1;j<=t;j++)
			f[y][j]=f[f[y][j-1]][j-1];
			q.push(y);
			}
		}
	}
}
int lca(int x,int y)
{
	if(d[x]>d[y]) swap(x,y);//确保y的深度更大
	for(int i=t;i>=0;i--)
	{
		if(d[f[y][i]]>=d[x])
		y=f[y][i];
	}
	if(x==y) return x;
	for(int i=t;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}
long long s(int x,int y,int k)
{
	long long r=0;
	while(1)
	{
		r=(r+p(d[x],k))%mod;
		if(x==y) break;
		x=f[x][0];
	}
	return r;
}
int sum(int x,int y,int k)
{
	int a=lca(x,y);
	long long sx=s(x,a,k),sy=s(y,a,k);
	return (sx+sy-p(d[a],k)+mod)%mod;
}
int main()
{
	cin>>n;
	t=log2(n)+1;
	memset(f,-1,sizeof(f));
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	bfs();
	cin>>m;
	while(m--)
	{
		int a,b,k;
		cin>>a>>b>>k;
		cout<<sum(a,b,k)<<endl;
	}
	return 0;
}
2025/8/2 09:26
加载中...