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组成的字符串,且任意前几个 ... 
随机推荐
- bitcask论文翻译/笔记
			翻译 论文来源:bitcask-intro.pdf (riak.com) 背景介绍 Bitcask的起源与Riak分布式数据库的历史紧密相连.在Riak的K/V集群中,每个节点都使用了可插拔的本地存储 ... 
- apache mina
			本文为博主原创,未经允许不得转载: Apache Mina(Apache Multipurpose Infrastructure for Network Applications)是一个基于Java的 ... 
- [转帖]061、监控指标之TiKV
			资源相关 Grafana监控 TiKV-Details -> Cluster - Store Size / Available Size Grafana监控 TiKV-Details -> ... 
- [转帖]【OS】OSWbb(OSWatcher Black Box)的简介和使用
			http://blog.itpub.net/26736162/viewspace-2142613/ OSWatcher Black Box, 简称OSW,是提供的一个小但是非常有用的工具,它通过调用O ... 
- [转帖]FT-2000+/64 - Phytium
			https://en.wikichip.org/wiki/phytium/feiteng/ft-2000%2B-64 Edit Values FT-2000+/64 General Info De ... 
- [转帖]Arm vs X86 (unfinished)
			http://home.ustc.edu.cn/~shaojiemike/posts/arm/ ARM Ltd history 诞生 1981年,被Intel拒绝的Acorn(橡子) Comput ... 
- SMEE 国内最新光刻机
- MYSQL 简单验证
			建立测试表 create table test001 (a varchar(2000),b varchar(2000),c varchar(2000),d varchar(2000),e varcha ... 
- 基于Seata探寻分布式事务的实现方案
			作者:京东物流技术与数据智能部 张硕 1 背景知识 随着业务的快速发展.业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构.随之而来就必然遇到分布式事务这个难题,这篇文章 ... 
- vue3跟新视图遇见神奇现象
			场景描述 今天遇见一个问题, tableAllFun 函数中写了一个 index=1; 然后在 otherAllFun 函数中去改变这个index=2的值 奇怪的事情发生了 在视图index展示的值是 ... 
