事先声明:由于对博客搬家弃疗,所以手动把原本自己在其他博客上写的转过来,文末时间不作改动,只是简单粗暴的COPY

仍然是数学

卡特兰数是一个非常神奇的东西

序列长这样↓

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786……(从第零项开始)

通常比较常用的应该是递推式和组合数的求法

递推式:

f(n)=f(n-1)*(4n-2)/(n+1)

其中令f(0)=1

组合数:

f(n)=C(2n,n)/(n+1)

通常情况下,碰到一道题,你不确定是不是卡特兰数,可以手动或写个暴力跑出来比对结果,一般来说前七八项符合条件,那就没什么问题了,反正我碰到的就是这个样子2333

我碰到过的卡特兰数题好像不是很多。吧

【一】二叉树

求n个节点构成的不同二叉树个数(n≤8000)

这是一道很经典的题目,很多地方都有,n的范围可以到七八千左右吧

最朴素的算法就是暴力搜索了,虽然拿不了几分==

把前面几个算出来,可以发现就是卡特兰数的序列,然后就可以直接写了

发现是卡特兰数不难,但是关键选择计算卡特兰数的方法

首先n那么大,显然是要高精度的,高精度的话复杂度就和答案长度有关了,n为七八千的时候,答案长度会达到四五千,是非常大的一个数,所以必须要考虑压位

递推式的话,时间复杂度为O(nlen)也就是递推复杂度乘上高精度乘除的复杂度

下面放上fp代码↓

 const tt=1000000000;type arr=array[0..550]of int64;var n:longint;ans,ans1:arr;procedure init;var i:longint;beginassign(input,'secret.in');reset(input);assign(output,'secret.out');rewrite(output);readln(n);end;function mul(a:arr;x:longint):arr;var i:longint;c:arr;beginfillchar(c,sizeof(c),0);c[0]:=a[0];for i:=1 to c[0] dobegininc(c[i],a[i]*x);inc(c[i+1],c[i] div tt);c[i]:=c[i] mod tt;end;if c[c[0]+1]>0 then inc(c[0]);while (c[0]>1)and(c[c[0]]=0) do dec(c[0]);exit(c);end;function divx(a:arr;x:longint):arr;var i:longint;c:arr;yu:int64;beginfillchar(c,sizeof(c),0);c[0]:=a[0];yu:=0;for i:=c[0] downto 1 dobeginyu:=a[i] mod x;inc(a[i-1],yu*tt);c[i]:=a[i] div x;end;if c[c[0]+1]>0 then inc(c[0]);while (c[c[0]]=0)and(c[0]>1) do dec(c[0]);exit(c);end;procedure main;var i:longint;beginans[0]:=1;ans[1]:=1;for i:=2 to n doans:=divx(mul(ans,4*i-2),i+1);end;procedure print;var i,j:longint;s:string;beginwrite(ans[ans[0]]);for i:=ans[0]-1 downto 1 dobeginstr(ans[i],s);for j:=9 downto length(s)+1 do write(0);write(s);end;close(input);close(output);end;begininit;main;print;end.

如果选组合数的话,按照组合数定义一个个跑的话复杂度和递推差不多==

所以可以进行拆分质因子,因为任何一个合数都可以拆分成若干个质因子相乘的形式,质数看成它本身即↓

X=(p1^a1)*(p2^a2)*(p3^a3)*(p4^a4)*……*(pk^ak)  (pi为质数)

所以通过枚举这些质因子求积,连乘的可以通过快速幂来实现,调用高精度乘法的次数减少了,只用在快速幂和幂的连乘,质因子只有根号个,复杂度就妥妥的降下来了,代码看下面↓

 const tt=1000000000;type arr=array[0..550]of int64;var n:longint;hash:array[0..16005]of longint;vis:array[0..16005]of boolean;ans:arr;procedure init;beginassign(input,'secret.in');reset(input);assign(output,'secret.out');rewrite(output);readln(n);end;procedure maker;var i,j:longint;beginfillchar(vis,sizeof(vis),1);for i:=2 to trunc(sqrt(2*n)) dofor j:=2 to 2*n div i doif vis[i] then vis[i*j]:=false;end;function count(x,p:longint):longint;begincount:=0;while x>=p dobegininc(count,x div p);x:=x div p;end;end;function mul(a,b:arr):arr;var i,j:longint;c:arr;beginfillchar(c,sizeof(c),0);c[0]:=a[0]+b[0]-1;for i:=1 to a[0] dofor j:=1 to b[0] dobegininc(c[i+j-1],a[i]*b[j]);inc(c[i+j],c[i+j-1] div tt);c[i+j-1]:=c[i+j-1] mod tt;end;if c[c[0]+1]>0 then inc(c[0]);while (c[c[0]]=0)and(c[0]>1) do dec(c[0]);exit(c);end;function power(a,b:longint):arr;var sum,w:arr;beginw[0]:=1;w[1]:=a;sum[0]:=1;sum[1]:=1;while b<>0 dobeginif b and 1=1 then sum:=mul(sum,w);w:=mul(w,w);b:=b>>1;end;exit(sum);end;procedure main;var i:longint;beginmaker;fillchar(hash,sizeof(hash),0);for i:=2 to n*2 doif vis[i] then hash[i]:=count(n*2,i)-count(n,i)-count(n+1,i);ans[1]:=1;ans[0]:=1;for i:=2 to 2*n doif hash[i]<>0 then ans:=mul(ans,power(i,hash[i]));end;procedure print;var i,j:longint;s:string;beginwrite(ans[ans[0]]);for i:=ans[0]-1 downto 1 dobeginstr(ans[i],s);for j:=length(s)+1 to 9 do write(0);write(s);end;close(input);close(output);end;begininit;main;print;end.

所以就解好了

【二】出栈次序

一个栈(无穷大)的进栈序列为1,2,3,…,n,求不同的出栈序列个数

和上面那个题也是一个思路,最后答案序列是卡特兰数

类似的变形题有买票找零之类的

题目描述长这样↓

一场激烈的足球赛开始前,售票工作正在紧张的进行中,每张球票为 50 元,现有 2n 个人排队等待购票,其中有 n 个人手持 50 元的钞票,另外 n 个人手持 100 元的钞票,假设开始售票时售票处没有零钱,问 2n 个人有多少种排队方式,使售票处不至出现找不开钱的局面。

我最开始做的时候是找规律,发现答案刚好是卡特兰数就写了,后来发现可以转换成进出栈的问题就是50元看成进栈,100元的时候把找回的50元看做一次出栈就一毛一样了。。

【三】凸多边形的三角划分

在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。求n多边形不同划分的方案数f(n)。

题目变形有在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数之类的

【四】括号化

矩阵连乘: P=A1*A2*A3*……*An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,求不同括号化的方案数

方案数是f(n-1),然而并没做过这类的题==

好像就没有其他什么东西了诶

【写的有漏洞的,欢迎路过大神吐槽】

2016-08-09 22:35:33

Ending.

关于Catalan数相关推荐

  1. 面试收集--卡特兰数(Catalan数)应用

    引言:有高矮不同的12个人,现在要他们对应排成两列,保证两列分别有序,且对应位置总是第一列比第二列矮,请问有多少种排列方式? 这是蘑菇街笔试的时候一个题目,当时陷入了枚举分类的死循环中,殊不知如果知道 ...

  2. Catalan数——卡特兰数

    今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来 后来查了下,原来是Catalan数.悲剧啊,现在整理一下 Catalan数--卡特兰数] 一.Catalan数的定义令h( ...

  3. Catalan数推导(转载)

    Raney引理: 设整数序列A = {Ai, i=1, 2, -, N},且部分和Sk=A1+-+Ak,序列中所有的数字的和SN=1,在A的N个循环表示中,有且仅有一个序列B,满足B的任意部分和Si均 ...

  4. BZOJ 1856: [Scoi2010]字符串 [Catalan数]

    1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1418  Solved: 790 [Submit][Status ...

  5. POJ 2084 Catalan数+高精度

    POJ 2084 /***************************************** author : Grant Yuan* time : 2014/10/19 15:42* so ...

  6. C++打印0到N的Catalan数卡特兰数(附完整源码)

    打印0到N的Catalan数卡特兰数 打印0到N的Catalan数卡特兰数算法的完整源码(定义,实现,main函数测试) 打印0到N的Catalan数卡特兰数算法的完整源码(定义,实现,main函数测 ...

  7. [Catalan数三连]网格有趣的数列树屋阶梯

    如何让孩子爱上打表 Catalan数 Catalan数是组合数学中一个常出现在各种计数问题中的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名. 先丢个公式(设第n项为$ ...

  8. Catalan数推导及应用

    Catalan数的定义: 设表示用下面的方法把凸多边形区域分成三角形区域的方法数:在有n+1条边的凸多边形区域内通过插入在其中不相交的对角线而把它分成三角形区域.定义.则满足递推关系     这个递推 ...

  9. Catalan数的理解

    Catalan数的理解 f(0)=1 f(1)=1 f(2)=2 f(3)=5 f(4)=14 f(5)=42 f(2)=f(1)+f(1)   f(3)=f(2)+f(1)*f(1)*f(2)   ...

  10. Catalan数(数论)

    Catalan数 [参考网址]http://www.cnblogs.com/gongxijun/p/3232682.html 记得当时我们队写过一个,差点超时,现在找到了公式,感觉还是挺简单的. 还要 ...

最新文章

  1. 改进C#代码之24:通过定义并实现接口替代继承
  2. 从深度学习选择什么样的gpu来谈谈gpu的硬件架构
  3. 在已安装win10环境中利用EasyBCD引导安装Ubuntu18.04(亲自测试,都是血和泪)
  4. 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(八)
  5. 用 vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)
  6. LeetCode 6055. 转化时间需要的最少操作数(贪心)
  7. Maven——profile介绍
  8. ado.net 格式 1201
  9. java map的常用方法吗_Java Map接口常用方法
  10. 西瓜书+实战+吴恩达机器学习(十一)监督学习之集成学习
  11. 【python】10行代码下载B站弹幕
  12. 刀与剑-C++ COM组件调用
  13. 【毕设教程】ESP8266 WiFi 模块介绍和使用
  14. PAT甲之初窥门径(上)
  15. 在线直播源码,VUE 获奖名单滚动显示的两种方式
  16. ArduPilot之H743+BMI270x2+First Normal Takeoff
  17. Unity3D研究院之两种方式播放游戏视频
  18. 锂电回收行业硫酸镍溶液除硅
  19. 142、解密POE交换机供电秘密,8芯网线断芯不再害怕!
  20. CentOS关机和重启命令

热门文章

  1. 码一些有用的东西网站的域名被拦截怎么办? 教你快速解除各种拦截
  2. Xshell 连接linux主机
  3. linux 常用命令全称
  4. zzuli 2527: THE END IS COMING!!!!!//最小费用最大流
  5. 我们怎样处理垃圾网站举报?
  6. 冯·诺依曼体系结构是什么
  7. IPv6的被请求节点的组播地址
  8. Flex4/Flash开发在线音乐播放器 , 含演示地址
  9. 【Camera基础(一)】Camera摄像头工作原理及整机架构
  10. BTC World直播间冬季训练营空投福利!听课就送2000币