数论之卡特兰数
1、基本模型
有一个长度为 \(2n\)的\(01\)序列,其中\(1,0\)各 \(n\)个,要求对于任意的整数 $k \in [1,2n] $,数列的前 \(k\)个数中,\(1\)的个数不少于\(0\)
满足条件的序列的数量为
\]
另一种形式
\]
又一种形式
\]
递推式
\]
\]
2、证明
主要是运用了翻折的思想
可以通过这种方法得出更为普遍的结论
比如这道题
3、推论
以下问题都与卡特兰数有关
\(1\)、\(n\)个左括号和\(n\)个右括号组成的合法括号序列的数量为\(Cat_n\)
\(2\)、\(1,2,…,n\)经过一个栈,形成的合法出栈序列的数量为\(Cat_n\)
\(3\)、\(n\)个节点构成的不同二叉树的数量为\(Cat_n\)
\(4\)、在平面直角坐标系上,每一步只能向上或向右走,从\((0,0)\)走到\((n,n)\)并且除两个端点外不接触直线\(y=x\)的路线数量为\(2Cat_n-1\)
\(5\)、对凸 \(n+2\) 边形进行不同的三角形分割的方案数(分割线断点仅为顶点,且分割线仅在顶点上相交)
\(6\)、\(n\) 层的阶梯切割为 \(n\) 个矩形的切法数
4、解题思路
\(1\)、通过递推式得到卡特兰数
比如这道题
\(2\)、可以将题目转化为卡特兰数的模型
比如这道题
\(3\)、还可以找规律
卡特兰数的前几项:\(1,1,2,5,14,42,132\)
5、一些技巧
卡特兰的题目有很多需要高精度,建议学习一下我的高精度板子
还有一些题目给出的模数不是质数
我们可以把模数分解质因数,求出在模每一个质数下的答案,再用中国剩余定理和到一起
但是还有一种更简单的方法
因为分子比分母中一定存在数量更多的(或一样多)的因数 \(p\)
于是可以分别算出分子和分母中含有的某个质数 \(p\) 的指数是多少
再用上面的指数减去下面的指数,做一个快速幂就行了
求 \(n!\) 中 \(p\) 的指数
int cnt=0;
while(n){
n/=p;
cnt+=;
}