博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AcWing - 满足条件的01序列(组合数学&卡特兰数)
阅读量:1999 次
发布时间:2019-04-28

本文共 1368 字,大约阅读时间需要 4 分钟。

题目链接:

时/空限制:1s / 64MB

题目描述

给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个。

输出的答案对109+7取模。

输出格式

共一行,包含整数n。

输出格式

共一行,包含一个整数,表示答案。

数据范围

1≤n≤10^5

输入样例

3

输出样例

5

解题思路

题意:求任意前缀序列中0的个数都不少于1的个数的序列有多少个。

思路:卡特兰数裸题,在2n位序列中填入n个0的方案数为C(2n,n),不填0的其余n位自动填1。从中减去不符合要求(由左而右扫描,1的累计数大于0的累计数)的方案数即为所求。

    不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m个0的累计数和m+1个1的累计数,此后的2(n-m)-1位上有n-m个0和n-m-1个1。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m-1个0和n-m个1,结果得到一个由n-1个0和n+1个1组成的2n位序列,即一个不合要求的数对应于一个由n-1个0和n+1个1组成的排列。

    反过来,任何一个由n-1个0和n+1个1组成的2n位序列,由于0的个数少2个,2n为偶数,所以必定在某一个奇数位上出现1的累计数超过0的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位序列,即n-1个0和n+1个1组成的2n位序列必对应一个不符合要求的数。

因而不合要求的2n位序列与n-1个0,n+1个1组成的序列一一对应。

显然,不符合要求的方案数为C(2n,n-1)。由此得出输出序列的总数目为:

C_{2n}^{n}-C_{2n}^{n-1}=\frac{1}{n+1}C_{2n}^{n},也就是卡特兰数。

Accepted Code:

/*  * @Author: lzyws739307453  * @Language: C++  */#include 
using namespace std;typedef long long ll;const int MOD = 1e9 + 7;int Fast_Power(int a, int b, int p) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % p; a = 1ll * a * a % p; b >>= 1; } return res;}int Com_Num(int a, int b, int p) { int res = 1; for (int i = 1, j = a; i <= b; i++, j--) res = 1ll * res * j % p * Fast_Power(i, p - 2, p) % p; return res;}int main() { int n; scanf("%d", &n); printf("%d\n", 1ll * Com_Num(n << 1, n, MOD) * Fast_Power(n + 1, MOD - 2, MOD) % MOD); return 0;}

转载地址:http://wybtf.baihongyu.com/

你可能感兴趣的文章
Http协议的Delete和Put方法是做什么的?怎么用?
查看>>
C++中两个类交叉定义或递归定义的解决办法
查看>>
String.format详解
查看>>
JSONObject、JSONArray
查看>>
JSON parse 错误: unexpected token at分析和解决
查看>>
python built-in function summary
查看>>
对于git/热部署/创建maven工程的小记录
查看>>
在jsp中调用本地外部json文件的解决方法
查看>>
ECharts is not Loaded解决方案
查看>>
ECharts地图显示不完整,只显示南海诸岛问题
查看>>
echarts is not defined解决方案
查看>>
echarts切换tab时,第一个图表显示,第二个图表不显示的解决办法
查看>>
记一次Hive 行转列 引起的GC overhead limit exceeded
查看>>
Scala List的一些常用方法
查看>>
FastJson对JSON字符串、JSON对象及JavaBean之间的相互转换
查看>>
解决spark.rdd.MapPartitionsRDD cannot be cast to streaming.kafka010.HasOffsetRange问题
查看>>
sparkstreaming ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
查看>>
flume的ChannelExceptio以及memeryChannel中transactionCapacity和sink的batchsize需要注意事项
查看>>
git常用指令
查看>>
shell中获取当前日期,下月1日,上月底,上月同期日期,比较两个日期大小
查看>>