首页 > 其他分享 >题解 CF1830C【Hyperregular Bracket Strings】

题解 CF1830C【Hyperregular Bracket Strings】

时间:2023-06-17 12:22:47浏览次数:45  
标签:include ifac int 题解 LL long 括号 Bracket CF1830C

卡特兰数

一个长为 \(2n\) 的序列,填入括号,有多少种合法方案?

\(C_n=\sum_iC_iC_{n-i-1}\),其中 \(C_0=C_1=1\)。

它的封闭形式是 \(C_n=\binom{2n}{n}-\binom{2n}{n-1}\)。

problem

给定一个长度 \(n\) 和 \(k\) 个子区间 \(\{[l1​,r1​],[l2​,r2​],…,[lk​,rk​]\}\)。

问有多少个长度为 \(n\) 的合法括号序列,使得每一个子区间也是合法的括号序列。

\(n,k\leq 2^{18}\)。

solution

考虑对于两个区间 \(A,B\),记他们的交集为 \(C\),则明显:\(C,A/C,B/C\) 都应该是合法括号序列。(分开讨论有交集和覆盖的情况)

如果两个位置覆盖的区间集合相同,说它们在同一个等价类里面。那么:在同一等价类的位置,连起来应该是合法括号序列。判断这个东西可以使用异或哈希,计算答案使用 Catalan 数。

code

点击查看代码
#include <random>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr,##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
const int P=998244353;
void red(LL&x){x%=P;}
LL mod(LL x){return (x%P+P)%P;}
LL qpow(LL a,LL b,int p=P){LL r=1;for(;b;b>>=1,a=a*a%p) if(b&1) r=r*a%p; return r;}
template<int N,int P> struct C_prime{
	LL fac[N+10],ifac[N+10];
	C_prime(){
		for(int i=fac[0]=ifac[0]=1;i<=N;i++) fac[i]=fac[i-1]*i%P;
		ifac[N]=qpow(fac[N],P-2,P);
		for(int i=N-1;i>=1;i--) ifac[i]=ifac[i+1]*(i+1)%P;
	}
	LL operator()(int n,int m){return fac[n]*ifac[m]%P*ifac[n-m]%P;}
};
C_prime<1<<20,P> binom;
unsigned long long C[1<<20],sum[1<<20];
mt19937_64 rng(0x0b2d4a2f);
int n,m;
int mian(){
	for(int i=1,l,r;i<=m;i++){
		scanf("%d%d",&l,&r);
		unsigned long long w=rng();
		sum[l]^=w,sum[r+1]^=w;
	}
	map<LL,int> s;
	for(int i=1;i<=n;i++) s[sum[i]^=sum[i-1]]++;
	LL ans=1;
	for(auto p:s) red(ans*=C[p.second]);
	printf("%lld\n",mod(ans));
	return 0;
}
void reset(){
	memset(sum,0,sizeof(LL)*(n+10));
}
int main(){
//	#ifdef LOCAL
//	 	freopen("input.in","r",stdin);
//	#endif
	for(int i=1;i<=1<<19;i++) C[i<<1]=binom(i<<1,i)-binom(i<<1,i-1);
	for(scanf("%*d");~scanf("%d%d",&n,&m);reset(),mian());
	return 0;
}

标签:include,ifac,int,题解,LL,long,括号,Bracket,CF1830C
From: https://www.cnblogs.com/caijianhong/p/solution-CF1830C.html

相关文章

  • 【题解】CF754D Fedor and coupons(优先队列)
    【题解】CF754DFedorandcoupons题目链接CF754DFedorandcouponsCF1029CMaximalIntersection后者是前者的加强版。思路分析最开始,先考虑不删区间\((k=0)\)的情况:也就是给你一大堆区间,让你找他们的交集。这个还是比较好想的,我们刚开始让第二个区间与第一个区间相交......
  • 【CF1841C 题解】
    首先,我们把\(s\)翻转。考虑dp,\(f_{i,j,k}\)表示到了第\(i\)个字符,操作了\(j\)个字符,最大的字符为\(k\)的最大值。转移时枚举\(i-1\)的最大字符\(\ell(0\le\ell<5)\)。不操作第\(i\)个字符;\(f_{i,j,k}=\max\{f_{i-1,j,\ell}+w\}\)。操作第\(i\)......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节点,个数还要加\(1\)。示例程序1(C++11,POJ不支持):#include<bits/stdc++.h>......
  • P2860 [USACO06JAN]Redundant Paths G 题解 tarjan边双连通分量
    题目链接:https://www.luogu.com.cn/problem/P2860题目大意:给定一个无向连通图,求至少加几条边,能使其变成一个边双连通图。解题思路:边双连通分量缩点后计算度数为\(1\)的节点个数,假设有\(cnt\)个,则答案为\((cnt+1)/2\)。示例程序:#include<bits/stdc++.h>usingnamespacestd;......
  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后可以发现......
  • CF402E Strictly Positive Matrix 题解 tarjan强连通分量
    题目链接:http://codeforces.com/problemset/problem/402/E题目大意:给出一个矩阵\(A\),问是否存在一个正整数\(k\)使得\(A^k\)解题思路:根据矩阵的性质,\(A^k_{i,j}\gt0\)当且仅当\(i\)到\(j\)所以可以把矩阵转成图论模型,若\(A_{i,j}\gt0\),则从\(i\)往\(j\)如果所有点......
  • NOIP2020 T2 字符串匹配【题解】
    NOIP2020T2字符串匹配首先声明这篇题解存在大多数让我这种人看懂的废话,如果想要速通,请另寻他解题目简化定义字符串乘法为\(AB\)为把两个字符串拼起来,定义阶乘\(A^i\)表示\(\prod_{1}^iA\)再定义\(F(S)\)为\(S\)中出现奇数次字符的数量现给定一个字符串\(S\),求......
  • P1903 [国家集训队] 数颜色 / 维护队列 题解
    一、题目描述:给你一个长度为$n$的序列$a$,你需要进行$m$次操作。$类型\1\:将第\x\个元素的值修改为\v\。$$类型\2\:求区间\l\到\r\中有多少种数字。$数据范围:$1\len,m\le1333333,所有数字\le1\times10^6$ 二、解题思路:带......
  • CF1205C Palindromic Paths 题解
    很好的一道题,思路自然,步骤清晰,结论好猜。唯一的缺点可能只是我赛时没有看到。构造可行解看到题目,也许我们很快就能想出一个做法:每次询问\((i,j,i+1,j)\),每行第一个额外询问\((i,j,i+1,j)\),这样询问总共\(n^2-1\)次即可。当我们怀疑看错题目重新检查时发现了被微软翻译......
  • 「ULSG-1」泡水的铅筒 题解
    题目传送门题目描述一个圆锥放入一个长方体水池中,无水溢出,求长方体液面高度的最大、最小值。解题思路如果这个题只有一个数据点,此数据点只有一组数据,那这就是一道初中填空题()先考虑\(h1\)的最小值。由“铅筒被完全浸没且没有液体溢出水池外”一句可得,若圆锥放入水池后液面高......