爆零,求助
查看原帖
爆零,求助
398876
ss12345678楼主2021/7/13 18:37

爆零,求助

#include<bits/stdc++.h>
#define MAXN 300005
#define ll long long
using namespace std;
struct edge{
	int to,next;
}a[MAXN<<1];
int head[MAXN],deep[MAXN],tot,fa[MAXN][22];
int n,m,x,y,k,q[MAXN][55];
const int mod=998244353;
int ans,sum[MAXN][55];

void add(int x,int y)
{
	a[++tot].to=y;
	a[tot].next=head[x];
	head[x]=tot;
}

void dfs(int now,int f)
{
	fa[now][0]=f;
	deep[now]=deep[f]+1;
	for(int i=1;(1<<i)<=deep[now];++i)
	{
		fa[now][i]=fa[fa[now][i-1]][i-1];
	}
	for(int i=head[now];i;i=a[i].next)
	{
		if(a[i].to==f)continue;
		dfs(a[i].to,now);
	}
}

int lca(int x,int y)
{
	if(deep[x]<deep[y])swap(x,y);
	for(int i=20;i>=0&&deep[x]>deep[y];--i)
	{
		if(deep[fa[x][i]]>=deep[y])x=fa[x][i];
	}
	if(x==y)return x;
	for(int i=20;i>=0;--i)
	{
		if(fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}

int main()
{
	scanf("%d",&n);
	deep[0]=-1;
	for(int i=1;i<=n;i++)
	{
		q[i][0]=1;sum[i][0]=1;
		for(int j=1;j<=50;j++)
		{
			q[i][j]=(long long)q[i][j-1]*i%mod;
			sum[i][j]=((long long)sum[i-1][j]+q[i][j])%mod;
		}
	} 
	for(int i=1;i<=n-1;++i)
	{
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	
	scanf("%d",&m);
	for(int i=1;i<=n;i++)
	{
		q[i][0]=1;sum[i][0]=1;
		for(int j=1;j<=50;j++)
		{
			q[i][j]=(long long)q[i][j-1]*i%mod;
			sum[i][j]=((long long)sum[i-1][j]+q[i][j])%mod;
		}
	} 
	dfs(1,0);
	
	for(int i=1;i<=m;++i)
	{
		ans=0;
		scanf("%d%d%d",&x,&y,&k);
		int zu=lca(x,y);
		ans=((long long)(sum[deep[x]][k]+sum[deep[y]][k] ) % mod - ( sum[deep[zu]][k]+sum[deep[zu]-1][k]) % mod + mod ) % mod;
		printf("%d\n",ans);
	}
	return 0;
}
2021/7/13 18:37
加载中...