[题解]P1641 生成字符串
由题意可设\(f[i][j]\)表示用了\(i\)个\(0\),\(j\)个\(1\)的答案,那么有转移:
0&i>j\\
f[i][j-1]&i=j\\
f[i-1][j]+f[i][j-1]&i<j\\
\end{cases}\]
状态数是\(O(n^2)\),转移是\(O(1)\),总时间复杂度\(O(n^2)\),期望得分\(30\text{ pts}\)。
我们用数形结合的方式思考:

如图,我们将填\(1\)视为向右走\(1\)个单位长度,填\(0\)视为向上走\(1\)个单位长度,最终到达\((n,m)\)视为完成,此时点的轨迹形成了一条折线。每条折线对应一种方案,总方案数是\(C_{n+m}^n\)。
显然,当前方案是合法的\(\iff\)折线的每个顶点都不在直线\(y=x\)上方。
换句话说,当前方案不合法\(\iff\)折线与\(y=x+1\)有交点。
对于每个不合法的方案,我们选定其中一个交点,将它之前的折线沿着\(y=x+1\)翻折,得到图中橙色的虚线。我们将橙色折线与剩余的红色折线形成的部分记作折线\(b\)。
可以发现,\(b\)可以取到的形态,与不合法的方案是一一对应的。
所以不合法的方案数就是从\((-1,-1)\)走到\((n,m)\)的方案数,即\(C_{n+m}^{n+1}\)。
因此合法方案数就是\(C_{n+m}^n-C_{n+m}^{n+1}\),可以化简得到\(\frac{(n+m)!\times (n-m+1)}{(n+1)!\times m!}\)。
Catalan数\(H_n=C_{2n}^n-C_{2n}^{n-1}\)可以由此题的结论推得,相当于此题\(n=m\)的情况。
计算它需要使用逆元,此处使用费马小定理。
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define N 1000010
#define mod 20100403
using namespace std;
int n,m,inv[N],inv_fact[N];
int fac(int r){
int ans=1;
for(int i=1;i<=r;i++) ans=ans*i%mod;
return ans;
}
signed main(){
cin>>n>>m;
inv_fact[1]=inv[1]=1;
for(int i=2;i<=n+1;i++) inv[i]=(-mod/i*inv[mod%i]%mod+mod)%mod;
for(int i=2;i<=n+1;i++) inv_fact[i]=inv_fact[i-1]*inv[i]%mod;
cout<<fac(n+m)*(n-m+1)%mod*inv_fact[n+1]%mod*inv_fact[m]%mod<<"\n";
return 0;
}
[题解]P1641 生成字符串的更多相关文章
- [题解] [SCOI2010] 生成字符串
题面 题解 考虑到直接求合法方案不好求, 我们转化为用总方案减去不合法方案 总方案就是\(\binom{n+m}{m}\), 即在\(n+m\)个位置中放\(n\)个数 我们将初始的空序列看做\((0 ...
- 卡特兰数 洛谷P1641 [SCOI2010]生成字符串
卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...
- [SCOI2010]生成字符串 题解(卡特兰数的扩展)
[SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数 ...
- P1641 [SCOI2010]生成字符串
P1641 [SCOI2010]生成字符串 题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不 ...
- BZOJ1856 [SCOI2010]生成字符串 【组合数】
题目 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求 ...
- C# 生成字符串的 CheckSum
C# 生成字符串的 CheckSum private static string CheckSum(string message) { char[] chars = message.ToCharArr ...
- [SCOI2010]生成字符串
题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...
- c# .Net随机生成字符串代码
/// <summary> /// 随机生成字符串 /// </summary> /// <param name="OperationType"> ...
- RandomStringUtils工具类(java随机生成字符串)
使用RandomStringUtils可以选择生成随机字符串,可以是全字母,全数字,自定义生成字符等等... 其最基础的方法: 参数解读: count:需要生成的随机串位数 letters:只要字母 ...
- java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法
1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...
随机推荐
- cpp零碎知识点小记
字符串读取方法记录 记录 个人小结: 按整行读到string ,推荐用 方法2 getline(cin, string) 按整行读到char[] ,推荐用 方法4 cin.getline(cin, c ...
- 如何优雅的关闭channel?
一.channel使用存在的不方便地方 1.在不改变channel自身状态的情况下,无法获知一个channnel是否关闭. 2.关闭一个已经关闭的channel,会导致panic.因此,如果关闭cha ...
- 使用wxWidgets进行跨平台GUI开发(附1)
补充说明wxWidgets在Windows下使用CMake的配置 wxWidgets官方提供了一个在Windows下使用CMake来构建wxWidgets库的方法,这样便于你自己用CMake构建项目. ...
- ArkUI-X平台桥接Bridge说明
简介 平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递.ArkUI侧调用平台的方法.平台调用ArkUI侧的方法. 以Android平台为 ...
- SpringMVC获取请求参数乱码问题
使用配置:jdk18 tomcat8.5.75 (由于10经常会出一些莫名其妙的问题,所以就让它去我的D盘吃灰了) IDEA 2021.3.2 spring-framework-5.3.15 问题引出 ...
- 小米盒子4刷三方ROM
前提 小米盒子 以及 小米电视的系统都太垃圾了,到处都是广告.也不能怪小米,现在大环境下国内的手机.app.网页等广告无处不在! 所以出一个教程,刷三方纯净的ROM来避免这个问题. 前提准备 软件 下 ...
- 【10】LCT学习笔记
前言 老早就想写了,但是一直抽不出时间.借助集训的契机把这篇学习笔记写出来. 时间跨度比较长,可能有一些代码不是现在的码风,我会标注出来的. LCT 挺简单的,内容应该不多吧qwq. 长文警告:本文一 ...
- CF1227G Not Same 题解
CF1227G Not Same 构造.考虑按照每个数字进行考虑,每次填充一列. 观察样例 \(1\),不难发现可以构造使每一行或列一定有一个位置为 \(0\).我们不妨对于每一列限定这个 \(0\) ...
- 01数字IC综合
数字IC设计综合入门 目录 数字IC设计综合入门 目录 1. 什么是数字IC综合? 2. 综合EDA工具简介 3. 综合的输入文件 (Inputs) 3.1 RTL代码 (Verilog/VHDL) ...
- 客户端和服务端通信的多种函数的对比。linux 网络编程
第一种普通的read recv write Makefile #LOCAL_LIBRARY += -L./lib -lpal #LOCAL_LDFLAGS += -lm -lopus -lwebsoc ...