0pts求助
查看原帖
0pts求助
687685
not_so_littlekayen楼主2024/8/27 17:38

全WA 看不出问题TAT

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
#define Max 500005
#define rep(i, a, b) for(register int i = a;i <= b;i++)
#define brep(i, a, b) for(register int i = b;i >= a;i--)
int pre[Max], cnt, n, m, dp[Max][29], dep[Max] = {-1}, sum[Max][51];
struct edge{
	int to, next;
}g[Max];
void add(int u, int v)
{
	g[++cnt].to = v;
	g[cnt].next = pre[u];
	pre[u] = cnt;
}
void dfs(int u, int fa)
{
	dep[u] = dep[fa]+1;dp[u][0] = fa;
	rep(i, 1, 28)dp[u][i] = dp[dp[u][i-1]][i-1];
	int res = 1;
	rep(i, 1, 50)
	{
		res *= dep[u];res %= mod;
		sum[u][i] = sum[fa][i]+res;
		sum[u][i] %= mod;
	}
	for(int i = pre[u];i;i = g[i].next)
	{
		int v = g[i].to;
		if(v != fa)dfs(v, u);
	}
}
int lca(int u, int v)
{
	if(dep[u] < dep[v])swap(u, v);
	brep(i, 0, 28)
		if(dep[dp[u][i]] >= v)
			u = dp[u][i];
	if(u == v)return v;
	brep(i, 0, 28)
		if(dep[dp[u][i]] != dep[dp[v][i]])
		{
			u = dp[u][i];
			v = dp[v][i];
		}
	return dp[v][0];
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin >> n;
	rep(i, 1, n-1)
	{
		int u, v;
		cin >> u >> v;
		add(u, v);
	}
	dfs(1, 0);
	int a, b, k;
	cin >> m;
	rep(i, 1, m)
	{
		cin >> a >> b >> k;
		int x = lca(a, b);
		cout << ((sum[a][k]-sum[x][k]+sum[b][k]-sum[dp[x][0]][k])%mod+mod)%mod << endl;
		//       1.a -> x            2.x -> b
	}
	return 0;
}
2024/8/27 17:38
加载中...