Luogu 1641[SCOI2010]生成字符串 - 卡特兰数
Description
有$N$ 个 $1$ 和 $M$ 个 $0$ 组成的字符串, 满足前 $k$ 个字符中 $1$ 的个数不少于 $0$ 的个数。
求这样字符串的个数。
$1<=M <=N<=1e6$
Solution
正难则反, 很难直接求出满足条件的字符串的个数, 就从反面考虑。
$N$个$1$ 和 $M$ 个 $0$ 组成的字符串总共有 $C(N + M, N)$ 个, 再减去不满足条件的 字符串的个数就能够得到答案了。
不满足条件的字符串个数为$C(N+M,N+1)$
证明与 卡特兰数的证明类似:
设一个 不满足条件的字符串 $0$ 的个数 比 $1$ 多 的 位置为 $k$。
并且 对于任意 $j <k$, 前$j$个字符中$num_1>=num_0$, 而前$k$个字符$num_1<num_0$。
很显然 $num_0=num_1+1$, 我们将这个 $k$ 个字符都取反, $0$ 变成 $1$, $1$ 变成 $0$。
$0$ 的个数减少 $1$ 个, $1$ 的个数 增加 $1$个,
那么取反后的字符串 中 $1$ 的个数为 $N+1$, $0$ 的个数为 $M-1$。
由于 $N+1$个$1$ ,$M-1$个$0$ 组成的字符串恰好有$C(N+M,N+1)$个。
所以我们接下来要证明 它们是 一 一对应的,(即$(N,M)$中不满足条件的字符串通过转换能 对应上 $(N+1, M-1)$ 每种字符串)
现在已知 $(N,M)$ 能通过转换变成 $(N+1,M-1)$ 且没有重复。
只需证明$(N+1,M-1)$ 通过转换 变成 $(N,M)$ : 找到第一个 $1$ 比 $0$ 多的位置 $k$ 并把前 $k$ 个字符取反 即可。
证毕
最后答案就是 $C(N+M,N)-C(N+M,N+1)$。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std; const int mod = ;
const int N = 2e6 + ; ll fpow(ll a, ll b) {
ll re = ;
for (; b; b >>= , a = a * a % mod)
if (b & ) re = re * a % mod;
return re;
} ll fac[N], ans; int main()
{
int n, m, M;
scanf("%d%d", &n, &m);
M = n + m;
fac[] = fac[] = ;
for (int i = ; i <= M; ++i)
fac[i] = fac[i - ] * i % mod;
ans = fac[M] * fpow(fac[n], mod - ) % mod;
ans = ans * fpow(fac[m], mod - ) % mod;
ll tmp = fac[M] * fpow(fac[n + ], mod - ) % mod;
tmp = tmp * fpow(fac[m - ], mod - ) % mod;
ans = ans - tmp;
ans = (ans % mod + mod) % mod;
printf("%lld\n", ans);
}
Luogu 1641[SCOI2010]生成字符串 - 卡特兰数的更多相关文章
- Luogu 1641 [SCOI2010]生成字符串
		
结果和dp没有一点关系…… 30分算法:设$f_{i, j}$表示已经选了$i$个并且有$j$个是白色的状态数,转移显然,最后答案就是$f_{n + m, m}$,时间复杂度$O(n^{2})$. 1 ...
 - BZOJ1856或洛谷1641 [SCOI2010]生成字符串
		
BZOJ原题链接 洛谷原题链接 可以将\(1\)和\(0\)的个数和看成是\(x\)轴坐标,个数差看成\(y\)轴坐标. 向右上角走,即\(x\)轴坐标\(+1\),\(y\)轴坐标\(+1\),表示 ...
 - 洛谷 1641 [SCOI2010]生成字符串
		
题目戳这里 一句话题意 求\(C_{m+n}^{m}\)-\(C_{m+n}^{m-1}\) Solution 巨说这个题目很水 标签居然还有字符串? 但是我还不很会用逆元真的太菜了,还好此题模数P为 ...
 - Luogu P1641 [SCOI2010]生成字符串 组合数学
		
神仙.... 当时以为是,$x$代表$1$,$y$代表$0$,所以不能过$y=x$的路径数...结果不会... 然后康题解...ヾ(。`Д´。)竟然向右上是$1$,向右下是$0$.... 所以现在就是 ...
 - luogu P1641 [SCOI2010]生成字符串
		
传送门 代码极短 \(O(n^2)\)dp是设\(f_{i,j,k}\)表示前\(i\)位,放了\(j\)个1,后面还可以接着放\(k\)个0的方案,转移的话,如果放0,\(k\)就要减1,反之放了1 ...
 - [SCOI2010]生成字符串 题解(卡特兰数的扩展)
		
[SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数 ...
 - P1641 [SCOI2010]生成字符串
		
P1641 [SCOI2010]生成字符串 题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不 ...
 - 卡特兰数 洛谷P1641 [SCOI2010]生成字符串
		
卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...
 - Bzoj 1856: [Scoi2010]字符串  卡特兰数,乘法逆元,组合数,数论
		
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1194 Solved: 651[Submit][Status][ ...
 
随机推荐
- win10虚拟桌面;一不小心按错了突然只剩下桌面,启动的程序都没了
			
先说如何关闭虚拟桌面:ctrl+win+F4(万一你还没看到怎么关闭虚拟桌面,就创建并调整到虚拟桌面,会很懵的,因为你启动的所有程序全部都突然消失了,只剩下开机的桌面了): win10有个功能,虚拟桌 ...
 - HTTP 协议 详解
			
一.HTTP简介 1.HTTP协议,即超文本传输协议(Hypertext transfer protocol).是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相 ...
 - 1.3.7、CDH 搭建Hadoop在安装之前(端口---第三方组件使用的端口)
			
第三方组件使用的端口 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外部通信. Component ...
 - FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK
			
[FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK] 1.FLAG_ACTIVITY_NEW_TASK 2.FLAG_ACTIVITY_CLEAR_T ...
 - Mybatis多个in查询
			
Map<String, Object> params = null; List<Map<String, Object>> list=new ArrayList(); ...
 - spark快速开发之scala基础之3类,对象,特征
			
类 scala的类定义非常灵活 class test4 class test2{} class test3(x:Int) 定义一个带构造函数的类 class Point (x : Int,y : In ...
 - centos7.2 +cloudstack 4.11 +KVM +ceph 安装配置(网卡带聚合)
			
系统安装,注意:管理节点版本是有要求的,配置为centos 7.2 最小安装版本(非最小化安装). 系统分区要求 /boot/efi 200MB / 100G /var 100G swap 0 其它给 ...
 - mysql 5.7 基于GTID 主从同步的1236故障处理(其它事务故障等同)
			
登录从库 stop slave; 查看执行事务 show slave status\G Retrieved_Gtid_Set: Executed_Gtid_Set: ee3bdb44-f6a1-11 ...
 - js 定时执行
			
代码: 格式例子: setInterval(方法名,1000*60); setInterval("方法名()",1000*60); setInterval(function () ...
 - select-options and range
			
1.SELECT...WHERE ... IN ...,它后面跟着的是一个RANGE类型的内表,这种内表是通过RANGES或者SELECT-OPTIONS来定义的. 2.内表中包含四个字段:SIGN, ...