P1641 [SCOI2010] 生成字符串

由题意可设\(f[i][j]\)表示用了\(i\)个\(0\),\(j\)个\(1\)的答案,那么有转移:

\[f[i][j]=\begin{cases}
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 生成字符串的更多相关文章

  1. [题解] [SCOI2010] 生成字符串

    题面 题解 考虑到直接求合法方案不好求, 我们转化为用总方案减去不合法方案 总方案就是\(\binom{n+m}{m}\), 即在\(n+m\)个位置中放\(n\)个数 我们将初始的空序列看做\((0 ...

  2. 卡特兰数 洛谷P1641 [SCOI2010]生成字符串

    卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...

  3. [SCOI2010]生成字符串 题解(卡特兰数的扩展)

    [SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数 ...

  4. P1641 [SCOI2010]生成字符串

    P1641 [SCOI2010]生成字符串 题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不 ...

  5. BZOJ1856 [SCOI2010]生成字符串 【组合数】

    题目 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求 ...

  6. C# 生成字符串的 CheckSum

    C# 生成字符串的 CheckSum private static string CheckSum(string message) { char[] chars = message.ToCharArr ...

  7. [SCOI2010]生成字符串

    题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...

  8. c# .Net随机生成字符串代码

    /// <summary> /// 随机生成字符串 /// </summary> /// <param name="OperationType"> ...

  9. RandomStringUtils工具类(java随机生成字符串)

    使用RandomStringUtils可以选择生成随机字符串,可以是全字母,全数字,自定义生成字符等等... 其最基础的方法: 参数解读: count:需要生成的随机串位数 letters:只要字母 ...

  10. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

随机推荐

  1. cpp零碎知识点小记

    字符串读取方法记录 记录 个人小结: 按整行读到string ,推荐用 方法2 getline(cin, string) 按整行读到char[] ,推荐用 方法4 cin.getline(cin, c ...

  2. 如何优雅的关闭channel?

    一.channel使用存在的不方便地方 1.在不改变channel自身状态的情况下,无法获知一个channnel是否关闭. 2.关闭一个已经关闭的channel,会导致panic.因此,如果关闭cha ...

  3. 使用wxWidgets进行跨平台GUI开发(附1)

    补充说明wxWidgets在Windows下使用CMake的配置 wxWidgets官方提供了一个在Windows下使用CMake来构建wxWidgets库的方法,这样便于你自己用CMake构建项目. ...

  4. ArkUI-X平台桥接Bridge说明

    简介 平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递.ArkUI侧调用平台的方法.平台调用ArkUI侧的方法. 以Android平台为 ...

  5. SpringMVC获取请求参数乱码问题

    使用配置:jdk18 tomcat8.5.75 (由于10经常会出一些莫名其妙的问题,所以就让它去我的D盘吃灰了) IDEA 2021.3.2 spring-framework-5.3.15 问题引出 ...

  6. 小米盒子4刷三方ROM

    前提 小米盒子 以及 小米电视的系统都太垃圾了,到处都是广告.也不能怪小米,现在大环境下国内的手机.app.网页等广告无处不在! 所以出一个教程,刷三方纯净的ROM来避免这个问题. 前提准备 软件 下 ...

  7. 【10】LCT学习笔记

    前言 老早就想写了,但是一直抽不出时间.借助集训的契机把这篇学习笔记写出来. 时间跨度比较长,可能有一些代码不是现在的码风,我会标注出来的. LCT 挺简单的,内容应该不多吧qwq. 长文警告:本文一 ...

  8. CF1227G Not Same 题解

    CF1227G Not Same 构造.考虑按照每个数字进行考虑,每次填充一列. 观察样例 \(1\),不难发现可以构造使每一行或列一定有一个位置为 \(0\).我们不妨对于每一列限定这个 \(0\) ...

  9. 01数字IC综合

    数字IC设计综合入门 目录 数字IC设计综合入门 目录 1. 什么是数字IC综合? 2. 综合EDA工具简介 3. 综合的输入文件 (Inputs) 3.1 RTL代码 (Verilog/VHDL) ...

  10. 客户端和服务端通信的多种函数的对比。linux 网络编程

    第一种普通的read recv write Makefile #LOCAL_LIBRARY += -L./lib -lpal #LOCAL_LDFLAGS += -lm -lopus -lwebsoc ...