#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;
}
盲猜是随机数的问题
用 mt19937
过了,此帖结