Manasa and Combinatorics
题意:
给定n,求问由2n个字母B,n个字母A构成的字符串中
任意前缀B的个数大于A的个数且任意后缀B的个数大于A的个数的 字符串个数。
解法:
注意到答案不易于直接计算,所以我们考虑应用容斥原理。
注意到本题非常类似卡特兰数。
卡特兰数等价于从棋盘上$(1,1)$走到$(n,n)$且不穿过对角线的方案数。
1.先考虑求存在前缀B的个数<A的个数的方案数。
等价于从棋盘上$(1,1)$上走到$(2n,n)$ 且 穿过从$(1,1)$开始,以$(1,1)$为方向向量的直线$L$ 的 方案数。
当第一次穿过$L$时,必然是向右走了t步,向上走了t+1步,将从$(t,t+1)$开始的折线以L未为称轴翻折,
得到一个在棋盘上从$(1,1)$到$(n-1,2n+1)$的路径,
这样对于任意一个穿过$L$的从$(1,1)$到$(2n,n)$的行走方案 对应 一个 从$(1,1)$到$(n-1,2n+1)$的行走方案。
注意到任意一个从$(1,1)$到$(n-1,2n+1)$的路径也必然对应着一个从$(1,1)$到$(2n,n)$的穿过L的方案。
这样证明了两者一一对应,个数相同为 $C_{3n}^{n-1}$。
2.对于存在后缀B的个数<A的个数的方案数,同1得个数为 $C_{3n}^{n-1}$。
3.对于同时满足1,2的方案数,考虑对于原问题做1的等价之后,
问题转化为求 从$(1,1)$到$(n-1,2n+1)$ 且 经过 过终点的与L平行的直线 的路径数。
类比1中的方法进行再次翻折得到其个数为 $C_{3n}^{n-2}$
综上:答案为$C_{3n}^n - 2*C_{3n}^{n-1} + C_{3n}^{n-2}$
应用Lucas定理,计算总效率$O(P + logn)$
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 #define P 99991 6 #define LL long long 7 8 using namespace std; 9 10 LL fac[P]; 11 12 LL qpow(LL x,int n) 13 { 14 LL ans=1; 15 for(;n;n>>=1,x=x*x%P) 16 if(n&1) ans=ans*x%P; 17 return ans; 18 } 19 20 LL C(int n,int m) 21 { 22 if(n<m) return 0; 23 return fac[n]*qpow(fac[m],P-2)%P*qpow(fac[n-m],P-2)%P; 24 } 25 26 LL Lucas(LL n,LL m) 27 { 28 if(m<0) return 0; 29 if(!m || !n) return 1LL; 30 return Lucas(n/P,m/P) * C(n%P,m%P)%P; 31 } 32 33 int main() 34 { 35 fac[0]=1; 36 for(int i=1;i<P;i++) fac[i]=fac[i-1]*i%P; 37 LL n; 38 int T; 39 scanf("%d",&T); 40 while(T--) 41 { 42 cin>>n; 43 LL ans=Lucas(3*n,n)-2LL*Lucas(3*n,n-1)+Lucas(3*n,n-2); 44 cout << (ans%P+P) %P << endl; 45 } 46 }
View Code
转载于:https://www.cnblogs.com/lawyer/p/6558961.html
Manasa and Combinatorics相关推荐
- perl的Math::Combinatorics模块实现全排列
代码: #!/usr/bin/perl -w use Math::Combinatorics qw(permute); @a = (1,2,3,4);foreach(permute(@a)){prin ...
- Gig Combinatorics
G - Gig Combinatorics 题意:给你由{1,2,3}组成的序列,问1为开头,3为结尾,中间全为2的子序列有多少个?答案取模. 思路:DP, dp[i][j] 定义为 到i为止以j结尾 ...
- [hackerrank]Manasa and Stones
https://www.hackerrank.com/contests/w2/challenges/manasa-and-stones 简单题. #include<iostream> us ...
- Introductory Combinatorics 5th Solutions Chapter1 1~6
Richard A.Brualdi 组合数学5th 课后习题答案 其实这篇文章只是用来记录我解题思路的笔记. 第一章 什么是组合数学 1.证明 mxn 棋盘被多米诺骨牌完美覆盖当且仅当 m 和 n 中 ...
- B. Combinatorics Homework(抽屉原理)
Educational Codeforces Round 114 (Rated for Div. 2) 题意 给出字符a,b,c的数量,判断是否可以组成一个字符串,仅有m对相邻的字符相同.(需要用完所 ...
- Hossam and Combinatorics
给定一个长度为n的序列a,要求计算一共有多少对(i,j)使得abs(a[i]-a[j])=序列a中最大的abs(a[x]-a[y]),其中i!=j,x!=y; Hossam woke up bored ...
- Introductory Combinatorics 5th Chapter2 problem summary
Richard A.Brualdi 组合数学5th 课后习题答案 其实这篇文章只是用来记录我解题思路的笔记. 第二章 排列与组合 1.思路:分析清楚两个问题:a)要填几个空 b)每个空的约束是什么 2 ...
- 在线学位课程_您在四年制计算机科学学位课程中学到的知识
在线学位课程 by Colin Smith 通过科林·史密斯 您在四年制计算机科学学位课程中学到的知识 (What you learn in a 4 year Computer Science deg ...
- BNUOJ34980方(芳)格(哥)取数(好坑)
方(芳)格(哥)取数 Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class n ...
最新文章
- linux命令返回上一次所在的目录
- python注入_Python如何考虑代码注入安全?
- 倾斜模型精细化处理_广州智迅诚单体化实景三维模型为智慧城市提供了平台数据基础...
- Nginx中浏览器缓存的执行流程
- SAP CDS entity 中使用 @readonly 进行访问控制
- Azure SQL的DTU和eDTU到底是个什么鬼
- 【Python】Python迭代求解开平方算法
- Extjs chart 总结 reload-chart.js 修改
- 集成产品开发过程及其概念模型
- Java企业级实战项目
- ORACLE 中利用推理逻辑去算 上年同期 ,注意:ORACLE中查询条件是带有推理逻辑功能的,及oracle中的推理逻辑
- Java语言知识大盘点(期末总复习)三
- python字符串前加 f 的含义
- 如何开启全新旅途,实现旅游市场活力复苏
- 黑马程序员JAVAEE企业级开发应用教程笔记
- 惠普HP Deskjet 1180c 打印机驱动
- 华为测试岗面试经验(附面试流程)
- 2021年西式面点师(中级)复审考试及西式面点师(中级)模拟考试
- 2021年春季ACM训练赛第5场
- OpenGLES---点精灵
热门文章
- centos7光盘修复 grub_centos7修复grub2
- python装饰器应用论文_python 装饰器应用
- 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
- cs精英游戏python代码_python面向对象-cs游戏示例
- HTTPS-客户端与服务器三次握手过程(含wireshark分析)
- Python笔记-内置装饰器
- Leaflet文档阅读笔记-Markers With Custom Icons笔记
- C++工作笔记-C++代码实现接口的概念
- Qt工作笔记-对connect的第五个参数的研究
- php公众号客服系统,公众号在线客服系统哪个好,主流客服系统评测及推荐