社区讨论

0 pts 求条

P4427[BJOI2018] 求和参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m5gj2qmu
此快照首次捕获于
2025/01/03 17:03
去年
此快照最后确认于
2025/11/04 12:02
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

template <typename T>
inline void read(T &x)
{
	x = 0;
	bool f = false;
	char v = getchar();
	while(v != '-' && (v < '0' || v > '9')) v = getchar();
	if(v == '-') f = true, v = getchar();
	while(v >= '0' && v <= '9') x = (x << 3) + (x << 1) + (v & 15), v = getchar();
	if(f) x = -x;
}
template <typename T>
inline void write(T x)
{
	if(x < 0) putchar('-'), x = -x;
	if(x < 10) putchar(x | 48);
	else write(x / 10), putchar(x % 10 | 48); 
}
const int maxn = 1e6, maxl = 30, maxk = 50;
const long long mod = 998244353;
int n, q, u, v, k;
int fa[maxn + 5][maxl + 5];
int lg[maxn + 5];
int dep[maxn + 5];
long long sum[maxn + 5][maxk + 5];
vector<int> g[maxn + 5];
void add(int u, int v)
{
	g[u].push_back(v);
}
void dfs(int now, int f)
{
	fa[now][0] = f;
	dep[now] = dep[f] + 1;
	for(int i = 1; i <= lg[dep[now]]; ++ i)
	{
		fa[now][i] = fa[fa[now][i - 1]][i - 1]; 
	}
	for(int i : g[now]) 
	{
		if(i != f) dfs(i, now);
	}
}
int lca(int a, int b)
{
	if(dep[a] < dep[b]) swap(a, b);
	while(dep[a] > dep[b]) a = fa[a][lg[dep[a] - dep[b]]];
	if(a == b) return a;
	for(int i = lg[dep[a]]; i >= 0; -- i)
	{
		if(fa[a][i] != fa[b][i]) a = fa[a][i], b = fa[b][i];
	}
	return fa[a][0];
}
void init(int maxv)
{
	for(int i = 2; i <= maxv; ++ i) lg[i] = lg[i >> 1] + 1;
	for(int i = 1; i <= maxv; ++ i)
	{
		sum[i][0] = 1;
		for(int j = 1; j <= maxk; ++ j)
		{
			sum[i][j] = 1ll * sum[i][j - 1] * i % mod;
			sum[i][j] %= mod;
		}
		for(int j = 1; j <= maxk; ++ j)
		{
			sum[i][j] += sum[i - 1][j];
			sum[i][j] %= mod;
		}
	}
}
int main(void)
{
	read(n);
	init(n + 1);
	for(int i = 1; i < n; ++ i)
	{
		read(u), read(v);
		add(u, v);
		add(v, u);
	}
	dfs(1, 0);
	read(q);
	while(q--)
	{
		read(u), read(v), read(k);
		int t = lca(u, v);
		t = dep[t], u = dep[u], v = dep[v];
		-- t, -- u, -- v;
		long long ans = sum[u][k] - sum[t][k];
		ans %= mod;
		ans += mod;
		ans += sum[v][k];
		ans %= mod;
		ans -= sum[fa[t][0]][k];
		ans %= mod;
		ans += mod << 1;
		ans %= mod;
		write(ans), putchar('\n');
	}
	return 0; 
}
只能 AC hack 的最后一个点,求条

回复

1 条回复,欢迎继续交流。

正在加载回复...