Hyperregular Bracket Strings
题意:
给出n和k,有k组区间l,r,要求满足每个区间都是匹配的括号序列,且自己整体也是一个匹配的括号序列,长度为n,求满足条件的括号序列的数量,答案对998244353取模。
思路:
匹配的括号序列的数量即卡特兰数,先用异或一个随机数来标记区间,然后利用异或前缀和来记录每个位置的贡献。具体看代码。
tips:
随机数获取:
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
头文件:
#include <random>
#include <chrono>
代码
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
int n, a[maxn];
int m;
int fac[maxn], infac[maxn];
int f[maxn];
void solve() {
map<int, int> mp;
cin >> n >> m;
for (int i = 1; i <= n; i++) a[i] = 0;
while (m--) {
int l, r;
int x = rnd();
cin >> l >> r;
a[l] ^= x;
a[r + 1] ^= x;
}
for (int i = 1; i <= n; i++) a[i] ^= a[i - 1], mp[a[i]] ++;
f[0] = 1; for (int i = 1; i <= n; ++i)if (i % 2 == 0)f[i] = fac[i] * infac[i / 2] % mod * infac[i / 2] % mod * qmi(i / 2 + 1, mod - 2, mod) % mod;
int ans = 1;
for (auto i : mp) ans = ans * f[i.second] % mod;
cout << ans << endl;
}