首页 > 其他分享 >CF1264D Beautiful Bracket Sequence

CF1264D Beautiful Bracket Sequence

时间:2023-07-20 18:37:58浏览次数:31  
标签:Beautiful ch dbinom limits int sum CF1264D Bracket mod

这里是加强版,\(n\le 10^6\)。

考虑到最后删剩下括号序列形如 (((...(()))...)),想到枚举分界点。

设 \(p\) 为当前枚举的分界点,\(l\) 为 \([1,p]\) 内 ( 的个数,\(r\) 为 \([p+1,n]\) 内 ) 的个数,\(x\) 为 \([1,p]\) 内 ? 的个数,\(y\) 为 \([p+1,n]\) 内 ? 的个数。

那么 \(p\) 这个位置作为分界线的贡献为 \(\sum\limits_{i=0}^x(l+i)\dbinom{x}{i}\dbinom{y}{l+i-r}\),即枚举左边的 ? 有多少个是填 (,然后和右边匹配。

注意到这里的组合数有组合意义,那么当 \(l+i-r>y\) 或者 \(<0\) 时,\(\dbinom{y}{l+i-r}\) 应为 \(0\),因为右边匹配不完左边。

考虑化简:

\[\begin{aligned}&\sum\limits_{i=0}^x(l+i)\dbinom{x}{i}\dbinom{y}{l+i-r}\\=&l\sum\limits_{i=0}^{x}\dbinom{x}{i}\dbinom{y}{l+i-r}+\sum\limits_{i=0}^xi\dbinom{x}{i}\dbinom{y}{l+i-r}\end{aligned} \]

利用吸收恒等式和范德蒙德卷积不难推出:

\[\begin{aligned}&l\sum\limits_{i=0}^{x}\dbinom{x}{i}\dbinom{y}{l+i-r}+\sum\limits_{i=0}^xi\dbinom{x}{i}\dbinom{y}{l+i-r}\\=&l\sum\limits_{i=0}^x\dbinom{x}{i}\dbinom{y}{y+r-l-i}+x\sum\limits_{i=0}^{x}\dbinom{x-1}{i-1}\dbinom{y}{y+r-l-i}\\=&l\dbinom{x+y}{y+r-l}+x\dbinom{x+y-1}{y+r-l-1}\end{aligned} \]

\(O(n)\) 枚举 \(p\),计算贡献即可。

#include <bits/stdc++.h>
using namespace std;

namespace vbzIO {
	char ibuf[(1 << 20) + 1], *iS, *iT;
//	#if ONLINE_JUDGE
//	#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
//	#else
	#define gh() getchar()
//	#endif
	#define rd read
	#define wr write
	#define pc putchar
	#define pi pair<int, int>
	#define mp make_pair
	#define fi first
	#define se second
	#define pb push_back
	#define ins insert
	#define era erase
	inline int read () {
		char ch = gh();
		int x = 0;
		bool t = 0;
		while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
		while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
		return t ? ~(x - 1) : x;
	}
	inline void write(int x) {
		if (x < 0) {
			x = ~(x - 1);
			putchar('-');
		}
		if (x > 9)
			write(x / 10);
		putchar(x % 10 + '0');
	}
}
using vbzIO::read;
using vbzIO::write;

const int N = 1e6 + 100;
const int mod = 998244353;
int n, pr[N][3], fac[N], ifac[N], inv[N];
char s[N];

void init(int n) {
	fac[0] = ifac[0] = inv[1] = 1;
	for (int i = 1; i <= n; i++) {
		if (i > 1) inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;
		fac[i] = 1ll * fac[i - 1] * i % mod, ifac[i] = 1ll * ifac[i - 1] * inv[i] % mod;
	}
}

int C(int n, int m) {
	if (m < 0 || m > n) return 0;
	return 1ll * fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}

int main() {
	scanf("%s", s + 1), n = strlen(s + 1), init(n);
	for (int i = 1; i <= n; i++) {
		pr[i][0] = pr[i - 1][0] + (s[i] == '?');
		pr[i][1] = pr[i - 1][1] + (s[i] == '(');
		pr[i][2] = pr[i - 1][2] + (s[i] == ')');
	}
	int res = 0;
	for (int i = 1; i <= n - 1; i++) {
		(res += 1ll * pr[i][1] * C(pr[n][0], pr[n][0] - pr[i][0] + pr[n][2] - pr[i][2] - pr[i][1]) % mod) %= mod;
		(res += 1ll * pr[i][0] * C(pr[n][0] - 1, pr[n][0] - pr[i][0] + pr[n][2] - pr[i][2] - pr[i][1] - 1) % mod) %= mod;
	}
	wr(res);
	return 0;
}

标签:Beautiful,ch,dbinom,limits,int,sum,CF1264D,Bracket,mod
From: https://www.cnblogs.com/Ender32k/p/17569315.html

相关文章

  • CF1464F My Beautiful Madness
    一发最优解祭(Description给定一棵树,节点\(1\)到\(n\)标号,\(q\)个操作,你需要维护一个路径可重集合\(P\),操作一共三种:向\(P\)集合加入\(u\tov\)。在\(P\)集合中删掉\(u\tov\)(保证操作之前有加入,并且只删一个)。查询\(P\)集合中所有元素路径的\(d\)邻域的交集......
  • 题解 Bracket Insertion
    BracketInsertion神仙DP题,不愧是tourist。容易发现,括号序列一共有\(1\cdot3\cdot5...\cdot(2n-1)\)种生成方式。假如(为\(1\),)为\(-1\),那么一个序列合法的充要条件为:最小前缀和为\(0\),且以\(0\)结尾。现在考虑维护这些前缀和。如果我们在当前序列某一位后插......
  • urllib+BeautifulSoup爬取并解析2345天气王历史天气数据
    urllib+BeautifulSoup爬取并解析2345天气王历史天气数据网址:东城历史天气查询_历史天气预报查询_2345天气预报1、代码importjsonimportloggingimporturllib.parsefromdatetimeimportdate,datetimefromrandomimportrandintfromtimeimportsleepimportpymy......
  • AtCoder Beginner Contest 252 Ex K-th beautiful Necklace
    洛谷传送门AtCoder传送门不知道为什么可以想到设\(n_c\)为颜色\(c\)的出现次数,那么\(\prodn_c\)也即选的方案数\(\approx1.25\times10^{11}\)。发现\(B=\sqrt{\prodn_c}\)不大,考虑meet-in-the-middle,把所有颜色分成两部分,每一部分的\(\prodn_c\)都接近\(......
  • 题解 CF1830C【Hyperregular Bracket Strings】
    卡特兰数一个长为\(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​]\}\)。问有多......
  • Educational Codeforces Round 150 (Rated for Div. 2) B. Keep it Beautiful
    #include<iostream>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],res[N];intt;intmain(){ cin>>t; while(t--){ intn; cin>>n; for(inti=0;i<n;i++){ cin>>a[i]; } intk=a[0]; res[0]=......
  • 形容女性漂亮的英文:beautiful、elegant、attractive、lovely、pretty
    形容女性漂亮的英文:beautiful、elegant、attractive、lovely、pretty。1、beautiful英[?bju:t?fl]美[?bjut?f?l]adj.美丽的,美好的;极好的;[例句]Shewasaverybeautifulwoman她是个大美女。2、elegant英[?el?g?nt]美[??l?ɡ?nt]adj.(人或其举止)优美的;漂亮的;简炼的;简洁的;[......
  • beautifulSoup找不到元素
    问题:页面F12可以定位元素,但把网页下载到本地,无法定位2种原因:1、内容在一个标签中,放在json字符串里 #内容在input里inputInfo=soup.find_all('input')[3]['value']#页面所有内容xmInfo=json.loads(inputInfo)Agency=xmInfo['author']xmContent=xmInfo['conte......
  • beautifulSoup查找元素常用汇总
    0、初始化:frombs4importBeautifulSouppageSource=driver.page_sourcesoup=BeautifulSoup(pageSource,'html.parser')1、标签名定位方法1:soup.body方法2:li.select('a')2、查找2.1、单个查找2.1.1、按text内容查找xmSoup.find(text=re.compile(......
  • AtCoder Regular Contest 141 C Bracket and Permutation
    洛谷传送门AtCoder传送门考虑给出\(S\),如何求\(P,Q\)。先考虑\(P\),那我们肯定想让\(P\)的每一项都尽量往前靠。设\([1,k]\)为合法括号串,\(S_{k+1}=\texttt{)}\),那\(P\)的前\(k\)项依次为\(1\simk\),第\(k+1\)项不能为\(k+1\)了,那找到\(k+1\)之......