爆零
查看原帖
爆零
389540
imfkwk楼主2021/2/11 02:48

求余求着求着就成0了

#include <bits/stdc++.h>
#define int long long
#define N 300001
#define mod 998244353
using namespace std;

void read(int& x) {
	x = 0;
	int f = 1;
	
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	
	x = x * f;
}

void write(int x) {
	if (x < 0) {
		putchar('-');
		x = -x;
	}
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

//////////////////////////////////////////////////
int n, m;

int hd[N];
int fm[N];
int to[N];
int cnt;

int po(int x, int p) {
	int res = 1;
	while (p) {
		if (p & 1) res = res * x % mod;
		x = x * x % mod;
		p = p >> 1;
	}
	return res % mod;
}

void add(int x, int y) {
	++cnt;
	fm[cnt] = hd[x];
	to[cnt] = y;
	hd[x] = cnt;
}

int f[N][25];
int d[N];

void dfs(int u) {
	for (register int i = 1; i <= 20; ++i) {
		f[u][i] = f[f[u][i - 1]][i - 1];
	}
	
	for (int p = hd[u]; p; p = fm[p]) {
		int v = to[p];
		if (v != f[u][0]) {
			f[v][0] = u;
			d[v] = d[u] + 1;
			dfs(v);
		}
	}
}

int lca(int x, int y) {
	if (d[x] < d[y]) swap(x, y);
	int c = d[x] - d[y];
	
	for (register int i = 20; i >= 0; --i) {
		if (c & (1 << i)) x = f[x][i];
		if (x == y) return x;
	}
	
	for (register int i = 20; i >= 0; --i) {
		if (f[x][i] != f[y][i]) {
			x = f[x][i];
			y = f[y][i];
		}
	}
	
	return f[x][0];
}

int p[51][N];

void start() {
	for (register int i = 1; i <= 50; ++i) {
		for (register int j = 1; j <= n; ++j) {
			p[i][j] = (p[i][j - 1] + po(j, i)) % mod;
		}
	}
}

signed main(void) {
	read(n);
	
	start();
	
	for (register int i = 1; i <= n - 1; ++i) {
		int x, y;
		read(x); read(y);
		add(x, y);
		add(y, x);
	}
	
	dfs(1);
	
	read(m);
	
	while (m--) {
		int x, y, k;
		read(x); read(y); read(k);
		int g = lca(x, y);
		int ans = ((((p[k][d[x]] + p[k][d[y]]) % mod - p[k][d[f[g][0]]]) % mod - p[k][d[g]]) % mod + mod) % mod;
		write(ans);
		printf("\n");
	}
	
	return 0;
}
2021/2/11 02:48
加载中...