求助!!!,用例没过,最后发现是fa数组预处理错了,但是没找到问题!!!!
查看原帖
求助!!!,用例没过,最后发现是fa数组预处理错了,但是没找到问题!!!!
959579
xiaobu_dean楼主2023/7/12 13:03
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#define int long long 
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) 
using namespace std;
const int N = 3e6 + 50;
const int mod = 998244353;
struct Edge{
	int to,next;
}edge[N];
int head[N],cnt;
void init() {
	for (int i = 1;i <= N ;i++) {
		edge[i].next = -1;head[i] = -1; 
	}
	cnt = 0;
} 
void add(int u,int v) {
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	head[u] = cnt++;
}
// 以上为链式前向星模版 
int deep[N],fa[N][20];
//int mi[N]; // mi[i]表示deep[i]的i次方
int sum[N][55];  //sum[i][j]表示从根结点到结点i的每个结点深度的j次方的和
 
int fast_mi(int a,int b) { // 快速幂 
	int ans = 1;
	while (b) {
		if (b%2) {ans = (ans*a) % mod;}
		b >>= 1;a = (a*a) % mod;}
	return ans;
}

void dfs(int x,int father) { // 求节点的深度 
	deep[x] = deep[father] + 1;
	fa[x][0] = father;
	for (int i = 1;(1<<i) <= deep[x]; i++) {
		fa[x][i] = fa[fa[x][i-1]][i-1];
	} 
	for (int j = 1;j <= 50; j++) sum[x][j] = (sum[father][j] + fast_mi(deep[father],j)); // 统计前缀和
	for (int i = head[x];~i;i = edge[i].next) {
		int v = edge[i].to;
		if (v == father) continue;
		dfs(v,x);
	}
}
int LCA(int a,int b) { // 求LCA 
	if (deep[a] < deep[b]) swap(a,b);
	for (int i = log2(N);i >= 0; i--) {
		if (deep[a] - (1<<i) >= deep[b]) {
			a = fa[a][i];
		}
		if (a == b) return a;
		//if (deep[a] == deep[b] && fa[a][0] == fa[b][0]) return fa[a][0];
	}
	for (int i = log2(N);i >= 0; i--) {
		if (fa[a][i] != fa[b][i]) {
			a = fa[a][i];b = fa[b][i];
		}
	}
	return fa[a][0];
}
signed main() {
	ios;
	init();
	int n,m;
	cin >> n;
	for (int i = 1;i < n; i++) {
		int u,v;
		cin >> u >> v;
		add(u,v);add(v,u); 
	}
	dfs(1,0); 
	cin >> m;
	for (int i = 1;i <= m; i++) {
		int a,b,k;
		cin >> a >> b >> k;
		int l = LCA(a,b);
		//cout << sum[a][k] <<" "<<sum[b][k] <<" " << sum[l][k] << endl; 
		int ans = (sum[a][k] + sum[b][k] - sum[l][k] - sum[fa[l][0]][k] + 2 * mod) % mod;
		cout << ans << endl;
	}
	return 0;
} 
2023/7/12 13:03
加载中...