萌新刚学 OI,WA on #4 求条

image

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5, mod = 998244353;
int t, n, k, ans;
int fac[N + 5], inv[N + 5];
int qpow(int x, int y) {
	int res = 1;
	while (y) {
		if (y & 1) res = res * x % mod;
		x = x * x % mod;
		y >>= 1;
	}
	return res;
}
int C(int x, int y) {
	if (y > x) return 0;
	return fac[x] * inv[x - y] % mod * inv[y] % mod;
}
int cat(int x) {
	return (C(2 * x, x) - C(2 * x, x - 1) + mod) % mod; 
}
void init() {
	fac[0] = 1;
	for (int i = 1; i <= N; i++) fac[i] = fac[i - 1] * i % mod;
	inv[N] = qpow(fac[N], mod - 2);
	for (int i = N - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod; 
}
int hs[N + 5];
unordered_map<int, int> mp; 
signed main() {
	init(); 
	cin >> t;
	while (t--) {
		ans = 1;
		cin >> n >> k;
		for (int i = 1; i <= n; i++) hs[i] = 0;
		mp.clear();
		while (k--) {
			int l, r, base = rand();
			cin >> l >> r;
			hs[l] ^= base, hs[r + 1] ^= base;
		}
		int num = 0;
		for (int i = 1; i <= n; i++){
			num ^= hs[i];
			mp[num]++;
		}
		bool f = 1;
		for (pair<int, int> i : mp) {
			if (i.second & 1) {
				puts("0");
				f = 0;
				break;
			} 
			ans = ans * cat(i.second / 2) % mod;
		}
		if (f) cout << ans << "\n";
	}
	return 0;
}

image

盲猜是随机数的问题

mt19937 过了,此帖结