求助神秘 RE
查看原帖
求助神秘 RE
369181
bamboo12345楼主2025/1/10 19:51

翻了几版提交记录了,没跟我错的一样的,把快速幂内直接写 return 1 就不会 re,求为什么

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 21, maxn = (1 << N) + 5, mod = 998244353;
int n, m, p, x[maxn], y[maxn], w[maxn], val[maxn], inv[maxn], deg[maxn];
struct Poly {
	vector<int> a;
	void resize(int N) {
		a.resize(N);
	}
	int size() {
		return a.size();
	} 
	int& operator[](int x) {
		return a[x];
	}
	void FWT(int f) {
		for (int h = 2; h <= size(); h <<= 1) {
			for (int i = 0; i < size(); i += h) {
				for (int j = i; j < i + h / 2; j++) {
					int a0 = a[j], a1 = a[j + h / 2];
					a[j] = a0, a[j + h / 2] = (a1 + a0 * f + mod) % mod;
				}
			}
		}
	}
} ta[21 + 5], tb[21 + 5];
int pre[maxn];
int fnd(int x) {
	return (pre[x] == x ? x : pre[x] = fnd(pre[x]));
}
int qpow(int x, int k, int p) {
	int res = 1;
	while(k) {
		if(k & 1)
			res = res * x % p;
		x = x * x % p, k >>= 1;
	}
	return res;
}
int cnt[maxn];
signed main() {
	cin >> n >> m >> p;
	for (int i = 1; i <= m; i++) 
		cin >> x[i] >> y[i];
	for (int i = 1; i <= n; i++)
		cin >> w[i];
	for (int i = 0; i < (1 << n); i++) {
		for (int j = 1; j <= n; j++)
			pre[j] = j;
		int val1 = 0, cnt = 0;
		for (int j = 1; j <= n; j++)
			val1 += ((i >> j - 1) & 1) * w[j], cnt += ((i >> j - 1) & 1), deg[j] = 0;
		for (int j = 1; j <= m; j++) {
			if(!((i >> x[j] - 1) & 1) || !((i >> y[j] - 1) & 1))
				continue;
			if(fnd(x[j]) != fnd(y[j]))
				pre[fnd(x[j])] = fnd(y[j]), cnt--;
			deg[x[j]]++, deg[y[j]]++;
		}
		bool flag = (cnt == 1);
		for (int j = 1; j <= n; j++)
			if(deg[j] % 2)
				flag = 0;
		if(!flag)
			val[i] = qpow(val1, p, mod);
		inv[i] = qpow(val1, p * (mod - 2), mod);
	}
	for (int i = 0; i <= n; i++)
		ta[i].resize(1 << n), tb[i].resize(1 << n);
	for (int i = 0; i < (1 << n); i++)
		cnt[i] = cnt[i >> 1] + (i & 1);
	for (int i = 0; i < (1 << n); i++)
		ta[cnt[i]][i] = val[i];
	for (int i = 0; i < (1 << n); i++)
		ta[i].FWT(1);
	tb[0][0] = 1;
	tb[0].FWT(1);
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < i; j++)
			for (int k = 0; k < (1 << n); k++)
				tb[i][k] = (tb[i][k] + ta[i - j][k] * tb[j][k]) % mod;
		tb[i].FWT(-1);
		for (int j = 0; j < (1 << n); j++)
			tb[i][j] = (cnt[j] == i ? tb[i][j] * inv[j] % mod : 0);
		tb[i].FWT(1);
	}
	cout << tb[n][(1 << n) - 1] << endl;
	return 0;
}
2025/1/10 19:51
加载中...