前言
感觉今天又颓了一个早上
来总结一下卡特兰数的不同形式和证明吧
应用
我觉得知道栈模型就差不多了。。
别的能转化就转化咯
形式1
我们考虑,枚举最后一个出栈的那个点的编号
那么在
进来之前,
肯定已经出栈了,这个的方案是
然后
后面的话,就是有
的方案
然后乘起来就是答案了
这个的话,效率是
缺点就是时间很慢
但是优点是没有除法,在出题人毒瘤要你写高精度的时候可以减少码量
形式2
也就是组合数的形式
我们考虑,用全部减去不和法的
那么就是说现在你加入一个元素就是
,删除一个就是
你现在要从
走到
的方案数
但是不能走到x轴一下
总的显然是
我们考虑如果经过了x轴,那么肯定会到达
这一条直线
于是我们可以把第一次
的后面,翻转过来
也就是加入一个元素就是
,删除一个就是
然后这样的话,走到
的方案数就是答案了
并且显然地,对于每一种走到
在你第一次到达
的时候翻转都是一个合法的答案
然后就证完了
形式3
还是组合数的形式
这个的话,证明也十分简单
我们考虑证明
也就是要证明
把式子展开可以得到
然后就和后面的式子一样了
形式3
但是这个我并不会证明
但是你可以把这个式子拆开,可以得到一个比较好玩的形式
这样的话就是
虽然我还没有想好这个东西怎么出题。。
但是这个形式还是挺好玩的吧。。也算是一个通项,雾)
CODE:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
int main()
{
LL n;
scanf("%lld",&n);
LL ans=1;
for (LL u=1;u<=n;u++) ans=ans*(4*u-2);
for (LL u=1;u<=n+1;u++) ans=ans/u;
printf("%lld\n",ans);
return 0;
}