【csp2019模拟赛tkh】T1_excatalan
<前言>
(这只是一个我们自己的模拟赛啊。。。)
大佬们可以看看题目。
<正文>
煎蛋的疑惑(excatalan) (excatalan.cpp/c/pas)
【题目描述】
煎蛋酱有 n 个左括号和 n 个右括号,她喜欢把这些括号匹配起来玩。
某天她把这些括号排成了一个序列。
她发现无论如何匹配,至少有 2*m 个括号会失配。
她对此感到很好奇,于是希望你告诉她,这样的括号序列有多少个?
答案对 998244353 取模。
【输入格式】
从 excatalan.in 中读入数据
为一行两个整数 n 和 m
**【输出格式】**
输出到 excatalan.out 中
输出一行一个整数,代表答案。
【样例输入 1】
2 1
【样例输出 1】
3
【样例解释 1】
括号序列为:
(()) 至少失配 0 ×
()() 至少失配 0 ×
())( 至少失配 2 √
)(() 至少失配 2 √
)()( 至少失配 2 √
))(( 至少失配 4 ×
【样例输入 2,3,4】
见下发文件 excatalan2.in,excatalan3.in,excatalan4.in
【样例输出 2,3,4】
见下发文件 edcatalan2.ans,excatalan3.ans,excatalan4.ans
【数据规模与约定】
对于 16%的数据,满足 n,m<=9
对于 32%的数据,满足 n,m<=100
对于 52%的数据,满足 n,m<=1000
对于另外 20%的数据,满足 m=0
对于 100%的数据,满足 1<=n<=1000000,0<=m<=n
markdown的格式有些别扭,我也不会用如何美化,所以将就看看吧。
首先,我们发现n对括号恰好完全匹配的方案数就是卡特兰数,这个应该是一个常识了(然而我在考试的时候没想出来。。。)
再看看文件名,扩展卡特兰数,说明我们思路对了但是我们要的是恰好有m对失配的情况,这咋搞呢。
实际上看似不可做,在求卡特兰数的时候魔改一下公式就可以啦。
然而为什么呢?
有一种求卡特兰数的方法叫折线法。
这种方法有什么妙用呢?
我们知道一个卡特兰数的模型:在n*n矩阵上不过对角线的左下角到右上角的方案数就是第n项卡特兰数了。
还有一个模型是进出栈的问题,合法出栈顺序数。
我们把坐标轴倾斜一下,把对角线贴在x轴上,发现等价于不过x轴的,从原点到2n合法方案数。其中我们走的是一条折线,向上倾表示进栈,下斜表示一次出栈。
为什么是2n呢?具体我也不会证明,大概就是原本对角线是不能经过的,现在可以经过就要改变终点。
(以下内容参考这里)
上面有图,可以帮助理解。
整个过程认为是从坐标(0,0)走到(2n,0)。因为栈内必须要有元素,所以,折线不能在x轴下方,这样才是合法的。
不合法的方案呢?就是跨过了x轴,但仍然最终到达了终点的方案。
好的现在我们引入了这个模型,那么根据一些小知识合法方案=总方案-非法方案。
现在我们要求总方案。
即2n次操作,操作种类为2,要求每种操作次数相同,那相当于一个组合数问题,即\(\frac {(2n)!}{n! \times n!}\),也可以写成\(\binom{n}{2n}\)
接下来考虑非法方案。
即至少有一时刻折线处于x轴下方。
对于任意跨越x轴的情况,必有将与\(y=-1\)相交。
- 找出第一个与\(y=-1\)相交的点k,将k点以右的折线根据\(y=-1\)对称(即操作1与操作2互换了)。可以发现终点最终都会从\((2n,0)\)对称到\((2n,-2)\)。
由于对称总是能进行的,且是可逆的。我们可以得出所有跨越了x轴的折线总数是与从\((0,0)\)到\((2n,-2)\)的折线总数。
而后者的操作2比操作1要多\(0-(-2)=2\)次。即操作1为n-1,操作2为n+1。
总数为\(\binom{n-1}{2n}\)。
接下来减一下就可以发现卡特兰数的通项公式了。
讲了这么多,和这题有什么关系呢?
正常卡特兰数不能越过\(y=0\)线,相当于没有任何一次可以失配的机会。
本题所求的恰好m对失配,由折线法可以证明是\(\binom{n-m}{2n}-\binom{n-m-1}{2n}\)
就好像差分一样嘛!
这个推广恰好符合扩展卡特兰数,就是正解了。。(然而我考场上还是不会)
<后记>
AFO,没什么可说的
原文地址:https://www.cnblogs.com/zqytcl/p/11847273.html
- python笔记2-冒泡排序
- Lucas定理学习(进阶中)
- Java8时间类使用方法
- Selenium2+python自动化46-js解决click失效问题
- PCA实现一个简单的酒店推荐系统(附Python源码)
- 【干货】动手实践:理解和优化GAN(附代码)
- Selenium2+python自动化44-元素定位参数化(find_element)
- Selenium2+python自动化45-18种定位方法(find_elements)
- Python做文本挖掘的情感极性分析(基于情感词典的方法)
- Selenium2+python自动化42-判断元素(expected_conditions)
- 基于机器学习的文本情感极性分析
- Selenium2+python自动化43-判断title(title_is)
- hihoCoder #1142 : 三分求极值
- 容斥原理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- K8S Ingress使用|常见问题列表
- 部署Tomcat及负载均衡
- Jenkins常用插件Publish Over SSH
- Zabbix 4.0配置监控Linux客户端
- esp8266+oled+DHT 11温湿度显示
- esp8266+oled 显示时间日期
- esp8266+DHT11温湿传感器 制作web室内温度计
- Linux端口转发的几种常用方法
- kali破解wifi密码
- 面向对象的7种设计原则(7)-开闭原则
- [数据库介绍]一站式表达谱数据分析
- windows下hashcat利用GPU显卡性能破解密码
- TCGAG多组学联合分析数据库
- Docker安装及使用
- CVE-2020-0796漏洞复现(RCE)