CF1830C Hyperregular Bracket Strings
Hyperregular Bracket Strings
题目描述
给定一个数
我们定义,对于一个长度为 (
和 )
组成的合法括号序列,如果它的每一个区间
求好的括号序列的数量,答案对
Solution
先考虑所有区间两两不交的情况。发现如果保证所有区间内的括号序列合法,那么对于所有不在区间内的位置组成的括号序列也会是合法的。比如 ()(()(()))
中
但是此处区间可能存在交。只考虑两个相交的区间看有什么性质。发现两个区间
区间异或使用差分,时间复杂度
Code
mint fac[_N], ifac[_N];
void init(int n) {
fac[0] = 1; For(i, 1, n) fac[i] = fac[i-1] * i;
ifac[n] = 1 / fac[n]; Rof(i, n, 1) ifac[i-1] = ifac[i] * i;
}
mint binom(int x, int y) {
return x < y || y < 0 ? 0 : fac[x] * ifac[y] * ifac[x-y];
}
mint cat(int n) {
if (n & 1) return 0;
return binom(n, n / 2) - binom(n, n / 2 - 1);
}
mt19937_64 rnd(9);
signed main() {
cin.tie(0)->sync_with_stdio(0);
int T; cin >> T;
init(3e5);
while (T--) {
int N, M; cin >> N >> M;
vector<u64> val(N + 2, 0);
For(i, 1, M) {
int l, r; cin >> l >> r;
u64 v = rnd();
val[l] ^= v, val[r+1] ^= v;
}
unordered_map<u64, int> mp;
For(i, 1, N) val[i] ^= val[i-1], ++mp[val[i]];
mint ans = 1;
for (auto& pr: mp) ans *= cat(pr.second);
cout << ans << '\n';
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步