NC20277 [SCOI2010]字符串
题目
题目描述
lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数。现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗?
输入描述
输入数据是一行,包括2个数字n和m
输出描述
输出数据是一行,包括1个数字,表示满足要求的字符串数目,这个数可能会很大,只需输出这个数除以20100403的余数
示例1
输入
2 2
输出
2
备注
对于30%的数据,保证 \(1\leq m\leq n\leq 10^3\) 。
对于100%的数据,保证 \(1\leq m\leq n\leq 10^6\) 。
题解
知识点:卡特兰数。
这道题是卡特兰数的变种,即终点不在 \((n,n)\) 而在 \((n,m)(n \geq m)\) 。
思路是完全一样的,任意非法路径沿 \(y = x+1\) 翻折,将唯一对应一条终点在 \((m-1,n+1)\) 的路径,同时任意一条终点在 \((m-1,n+1)\) 的路径都对应一条非法路径,所以这两者是一一对应的。因此,答案是 \(\dbinom{n+m}{m} - \dbinom{n+m}{m-1}\) 。
时间复杂度 \(O(n+m)\)
空间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int P = 20100403;
namespace Number_Theory {
const int N = 2e6 + 7;
int qpow(int a, ll k) {
int ans = 1;
while (k) {
if (k & 1) ans = 1LL * ans * a % P;
k >>= 1;
a = 1LL * a * a % P;
}
return ans;
}
int fact[N], invfact[N];
void init(int n) {
fact[0] = 1;
for (int i = 1;i <= n;i++) fact[i] = 1LL * i * fact[i - 1] % P;
invfact[n] = qpow(fact[n], P - 2);
for (int i = n;i >= 1;i--) invfact[i - 1] = 1LL * invfact[i] * i % P;
}
}
namespace CNM {
using namespace Number_Theory;
int C(int n, int m) {
if (n == m && m == -1) return 1; //* 隔板法特判
if (n < m || m < 0) return 0;
return 1LL * fact[n] * invfact[n - m] % P * invfact[m] % P;
}
}
namespace Catalan {
int F(int n, int m) { return (CNM::C(n + m, m) - CNM::C(n + m, m - 1) + P) % P; }
int H(int n) { return F(n, n); }
}
/// Catalan数,O(n),质数模数下利用组合数快速求出Catalan数
//* F为推广形式,在合法条件下到达任意终点(n,m)的方案数(n >= m)
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
Number_Theory::init(n + m);
cout << Catalan::F(n, m) << '\n';
return 0;
}
NC20277 [SCOI2010]字符串的更多相关文章
- Bzoj 1856: [Scoi2010]字符串 卡特兰数,乘法逆元,组合数,数论
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1194 Solved: 651[Submit][Status][ ...
- BZOJ 1856: [Scoi2010]字符串( 组合数 )
求(0,0)->(n,m)且在直线y=x下方(可以在y=x上)的方案数...同 http://www.cnblogs.com/JSZX11556/p/4908648.html --------- ...
- 1856: [Scoi2010]字符串
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 847 Solved: 434[Submit][Status] D ...
- BZOJ 1856: [Scoi2010]字符串 [Catalan数]
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1418 Solved: 790[Submit][Status][ ...
- 【BZOJ1856】[SCOI2010]字符串(组合数学)
[BZOJ1856][SCOI2010]字符串(组合数学) 题面 BZOJ 洛谷 题解 把放一个\(1\)看做在平面直角坐标系上沿着\(x\)正半轴走一步,放一个\(0\)看做往\(y\)轴正半轴走一 ...
- bzoj 1856: [Scoi2010]字符串 卡特兰数
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1458 Solved: 814[Submit][Status][ ...
- 1856: [Scoi2010]字符串(Catalan数)
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 2117 Solved: 1211[Submit][Status] ...
- BZOJ1856[SCOI2010]字符串
Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...
- 【BZOJ】1856: [Scoi2010]字符串
http://www.lydsy.com/JudgeOnline/problem.php?id=1856 题意:把n个1和m个0组成字符串,要求在组成的字符串中,任意的前k个字符1的个数不能少于0的个 ...
- BZOJ1856 [Scoi2010]字符串 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8084577.html 题目传送门 - BZOJ1856 题意概括 找出由n个1,m个0组成的字符串,且任意前几个 ...
随机推荐
- linux route 命令
route 管理路由表 要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是为了解决以下问题:该Linux ...
- 基于html+jquery开发的科学计算器(课程作业)
基于html和jquery开发的科学计算器,该科学计算器可进行乘方.开方.指数.对数.三角函数.统计等方面的运算,又称函数计算器. 科学型带有所有普通的函数,所有的函数都分布在键盘上以致于你可以不用通 ...
- 【C++】类概念及使用
类定义中不允许对数据成员初始化 类外只能访问公有部分 类成员必须指定访问属性 类的成员函数是实现对封装的数据成员进行操作的唯一途径 类定义中不允许定义本类对象,因无法预知大小 类与结构形式相同,唯一区 ...
- 一种基于linux系统的精准流量统计方法
前言: 在linux系统关于流量统计,已经有开源的工具,比如nethogs,nload和iptraf.它们适合我们在PC上直接监控某台设备的流量情况,但并不适合我们应用到自己的程序中去. 如果要在 ...
- [转帖]能使 Oracle 索引失效的六大限制条件
Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反. 例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可能是 oracle 索引失效造成的.or ...
- [转帖]如何通过dba_hist_active_sess_history分析数据库历史性能问题
https://www.cnblogs.com/DataArt/p/10018932.html 在数据库运行的过程中,我们有时会碰到数据库hung住的问题,在这个时候很多人会选择尽快让它恢复正常而不是 ...
- [转帖]使用 BR 命令行备份恢复
TiDB试用 来源:TiDB 浏览 404 扫码 分享 2021-04-20 20:49:42 使用 BR 命令行进行备份恢复 BR 命令行描述 命令和子命令 常用选项 使用 BR 命令行备份集群数 ...
- [转帖]centos7离线安装postgresql13
https://www.cnblogs.com/summer-88/p/15341918.html 在一台可以联网的centos上安装postgresql源 yum install -y https: ...
- [转帖]Linux—vi/vim批量注释及取消注释
https://www.jianshu.com/p/45c252e9d2b6 应用场景 在开发场景中,经常遇到对一些配置文件进行注释,当然如果确定不用的时候我们可以通过vim中的D命令进行删除.当 ...
- [转帖]Linux Shell:date日期时间操作
https://www.jianshu.com/p/cc9ebb212a8e 整理Linux Shell脚本中常用的日期操作,给予date命令,主要用法总结 获得当前日期,时间戳,date,date ...