正题

题目链接:https://www.luogu.com.cn/problem/P7044?contestId=36089


题目大意

一个括号序列,0级偏值定义为其中不合法的括号数量。
kkk级偏值定义为它所有子串的k−1k-1k−1级偏值的和。
求这个括号序列的kkk级偏值。


解题思路

后文中我们定义G(x,y)=Cx+y−1yG(x,y)=C_{x+y-1}^yG(x,y)=Cx+y−1y​

考虑每一对括号的贡献,不合法情况为只选择左括号或者只选择右括号。我们设他们为[l,r][l,r][l,r],那么只包含左括号就是L∈[1,l],R∈[l,r−1]L\in[1,l],R\in[l,r-1]L∈[1,l],R∈[l,r−1]的区间。转换到kkk阶就是G(l,k)G(l,k)G(l,k)。

右边就不同了,我们观察一下每个阶时的值

r-3 r-2 r-1 r r+1
1 1 1 0 0
1 2 3 3 3
1 3 6 9 12

不难发现到后面(x,y)(x,y)(x,y)这个位置就是G(x,y)−G(x−r+l−1,y)G(x,y)-G(x-r+l-1,y)G(x,y)−G(x−r+l−1,y)

用组合数统计答案即可。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)(线性预处理逆元可以做到O(n)O(n)O(n))


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll N=2e6+10,XJQ=998244353;
ll n,k,ans,fac[N],inv[N];
char s[N];stack<int> S;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
ll G(ll n,ll m){if(n<=0||m<0)return 0;n=n+m-1;return fac[n]*inv[m]%XJQ*inv[n-m]%XJQ;
}
ll solve(ll l,ll r,bool op){ll ans=1;if(op)l=n-l+1,r=n-r+1,swap(l,r);ans=(G(r,k)-G(l-1,k)+XJQ)%XJQ;return ans;
}
int main()
{scanf("%lld%lld",&n,&k);ll lim=max(n,k);fac[0]=inv[0]=1;for(ll i=1;i<=2*lim;i++){fac[i]=fac[i-1]*i%XJQ;inv[i]=power(fac[i],XJQ-2);}scanf("%s",s+1);for(ll i=1;i<=n;i++){if(s[i]=='(')S.push(i);else{if(!S.empty()){ans=(ans+solve(1,S.top(),0)*solve(S.top(),i-1,1)%XJQ)%XJQ;S.pop();}else ans=(ans+solve(1,i,0)*solve(i,n,1)%XJQ)%XJQ;}}while(!S.empty())S.pop();for(ll i=n;i>=1;i--){if(s[i]==')')S.push(i);else{if(!S.empty()){ans=(ans+solve(S.top(),n,1)*solve(i+1,S.top(),0)%XJQ)%XJQ;S.pop();}else ans=(ans+solve(1,i,0)*solve(i,n,1)%XJQ)%XJQ;}}printf("%lld",ans);
}

P7044-[MCOI-03]括号【组合数学】相关推荐

  1. Linux 内核Coding Style整理

    总结linux内核开发的coding style, 便于以后写代码时参考. 下面只是罗列一些规则, 具体说明可以参考: 内核源码(Documentation/CodingStyle) 01 - 缩进 ...

  2. 20160218.CCPP体系具体解释(0028天)

    程序片段(01):加法.c 内容概要:字符串计算表达式 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <st ...

  3. 系统特殊符号、通配符号、正则符号、find、grep、sed、awk命令(总结)

    目录 一.常见系统特殊符号 (一)基础符号系列 1)美元符号  $ 2)叹号符号  ! 3)竖线符号  | 4)井号符号  # (二)引号符号系列 (三)定向符号系列 (四)路径符号系列 (五)逻辑符 ...

  4. 离散数学与组合数学-03函数

    文章目录 离散数学与组合数学-03函数 3.1 函数基本概念 3.1.1 函数的定义 3.1.2 函数举例 3.1.3 函数的数量 3.1.4 关系与函数的差别 3.2函数的类型 3.2.1 函数类型 ...

  5. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

  6. c++ include 路径_头文件中,#include使用引号“”和尖括号lt;gt;有什么区别?

    很多程序员写代码,可能没有仔细研究一些细节问题,比如今天说的#include相关的内容. 01 关于#include 首先,#include为预处理语句,那么什么是预处理语句呢?预处理语句最明显的标志 ...

  7. 《LeetCode力扣练习》第20题 有效的括号 Java

    <LeetCode力扣练习>第20题 有效的括号 Java 一.资源 题目: 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符 ...

  8. 数据类型,运算符和表达式03 - 零基础入门学习C语言04

    第二章:数据类型,运算符和表达式03 让编程改变世界 Change the world by program 字符型数据 字符型数据包括字符常量和字符变量 字符常量: 是用单引号括起来的一个字符. 例 ...

  9. php %3cphp用大括号表示,整理HTML5中支持的URL编码与字符编码_html5教程技巧

    URL 编码URL 编码就是将 URLs 中不宜打印的字符或者具有特殊意义的字符转换为 Web 浏览器和服务器明白且普遍接受的表示法. 这些字符包括: ASCII 控制字符 - 不宜打印的字符通常用于 ...

最新文章

  1. 一位人工智能总监对AI行业的【实话实说】
  2. WPF一步一脚印系列(1):万事起头难
  3. android hardware architecture
  4. ae画面颜色一键选取替换修改插件Composite Brush for Mac 1.5.2
  5. 拟合方程是什么matlab,matlab离散型数据拟合方程,求系数,哪个大神能说说方法...
  6. angular2 图表指令ng2-echarts
  7. 安卓手机怎么root_怎么在腾讯手机管家中一键获取Root权限
  8. 自学python免费教材-Python 有哪些入门学习方法和值得推荐的经典教材?
  9. python元组_Python元组
  10. 一个网络传输框架——zeroMQ 调研笔记
  11. apache高性能配置
  12. NXP iMX8系列处理器核心性能对比测试
  13. bmp qimage 保存位_在Qt中保存QImage(Save a QImage in Qt)
  14. 医疗管理核心制度之 十八、信息安全管理制度
  15. CAE软件技术现状调研
  16. 【数字设计】恒玄科技_笔试面试题目分享
  17. Android 9.0 蓝牙配对流程
  18. 点线面的意义_【干货】设计中的点线面到底有什么用?
  19. Unreal 4 更改Engine位置
  20. Java学习-----文字版格斗游戏

热门文章

  1. oracle账号区分大小写吗,实战Oracle 11g用户密码不区分大小写
  2. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些
  3. oracle dbfile数,通过案例学调优之--Oracle参数(db_file_multiblock_read_count)
  4. 海德汉编程详细手册_UG编程海德汉系统螺旋铣孔最后一刀欠切解决方案
  5. lunixs 常用命令c语言,常用Lunix命令 - osc_271igh42的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. oracle dbf文件设置,oracle移动数据dbf文件
  7. PHP秒杀截流原理,节流阀和去抖动的基本实现方法介绍
  8. 你知道304吗?图解强缓存和协商缓存
  9. pip 设置超时时间_Python pip使用超时问题解决方案
  10. pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件