题意:

给定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相关推荐

  1. perl的Math::Combinatorics模块实现全排列

    代码: #!/usr/bin/perl -w use Math::Combinatorics qw(permute); @a = (1,2,3,4);foreach(permute(@a)){prin ...

  2. Gig Combinatorics

    G - Gig Combinatorics 题意:给你由{1,2,3}组成的序列,问1为开头,3为结尾,中间全为2的子序列有多少个?答案取模. 思路:DP, dp[i][j] 定义为 到i为止以j结尾 ...

  3. [hackerrank]Manasa and Stones

    https://www.hackerrank.com/contests/w2/challenges/manasa-and-stones 简单题. #include<iostream> us ...

  4. Introductory Combinatorics 5th Solutions Chapter1 1~6

    Richard A.Brualdi 组合数学5th 课后习题答案 其实这篇文章只是用来记录我解题思路的笔记. 第一章 什么是组合数学 1.证明 mxn 棋盘被多米诺骨牌完美覆盖当且仅当 m 和 n 中 ...

  5. B. Combinatorics Homework(抽屉原理)

    Educational Codeforces Round 114 (Rated for Div. 2) 题意 给出字符a,b,c的数量,判断是否可以组成一个字符串,仅有m对相邻的字符相同.(需要用完所 ...

  6. 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 ...

  7. Introductory Combinatorics 5th Chapter2 problem summary

    Richard A.Brualdi 组合数学5th 课后习题答案 其实这篇文章只是用来记录我解题思路的笔记. 第二章 排列与组合 1.思路:分析清楚两个问题:a)要填几个空 b)每个空的约束是什么 2 ...

  8. 在线学位课程_您在四年制计算机科学学位课程中学到的知识

    在线学位课程 by Colin Smith 通过科林·史密斯 您在四年制计算机科学学位课程中学到的知识 (What you learn in a 4 year Computer Science deg ...

  9. BNUOJ34980方(芳)格(哥)取数(好坑)

    方(芳)格(哥)取数 Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class n ...

最新文章

  1. linux命令返回上一次所在的目录
  2. python注入_Python如何考虑代码注入安全?
  3. 倾斜模型精细化处理_广州智迅诚单体化实景三维模型为智慧城市提供了平台数据基础...
  4. Nginx中浏览器缓存的执行流程
  5. SAP CDS entity 中使用 @readonly 进行访问控制
  6. Azure SQL的DTU和eDTU到底是个什么鬼
  7. 【Python】Python迭代求解开平方算法
  8. Extjs chart 总结 reload-chart.js 修改
  9. 集成产品开发过程及其概念模型
  10. Java企业级实战项目
  11. ORACLE 中利用推理逻辑去算 上年同期 ,注意:ORACLE中查询条件是带有推理逻辑功能的,及oracle中的推理逻辑
  12. Java语言知识大盘点(期末总复习)三
  13. python字符串前加 f 的含义
  14. 如何开启全新旅途,实现旅游市场活力复苏
  15. 黑马程序员JAVAEE企业级开发应用教程笔记
  16. 惠普HP Deskjet 1180c 打印机驱动
  17. 华为测试岗面试经验(附面试流程)
  18. 2021年西式面点师(中级)复审考试及西式面点师(中级)模拟考试
  19. 2021年春季ACM训练赛第5场
  20. OpenGLES---点精灵

热门文章

  1. centos7光盘修复 grub_centos7修复grub2
  2. python装饰器应用论文_python 装饰器应用
  3. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
  4. cs精英游戏python代码_python面向对象-cs游戏示例
  5. HTTPS-客户端与服务器三次握手过程(含wireshark分析)
  6. Python笔记-内置装饰器
  7. Leaflet文档阅读笔记-Markers With Custom Icons笔记
  8. C++工作笔记-C++代码实现接口的概念
  9. Qt工作笔记-对connect的第五个参数的研究
  10. php公众号客服系统,公众号在线客服系统哪个好,主流客服系统评测及推荐