catalan数与stirling数学习笔记(上)

(上)catalan数

先直接看看这个数列:(从第0项开始)1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...

然后是递推式:

然后是通项公式:

这些东西要记住也不难,但是到底这个catalan数有什么卵用呢?

貌似组合数学中很多组合结构都能直接利用catalan数,我们先来看一些例子吧:

  • C n表示所有包含 n组括号的合法运算式的个数: ((())) ()(()) ()()() (())() (()()) 。
  • C n表示有 n个节点组成不同构二叉树的方案数。下图中, n等于 3,圆形表示节点,月牙形表示什么都没有。
  • C n表示有 2n+1个节点组成不同构满二叉树(full binary tree)的方案数。下图中, n等于 3,圆形表示内部节点,月牙形表示外部节点。本质同上。

等等等等很多类似的问题(我就不全复制过来了)通过一定的逻辑上的转化都可以归结为一类问题:有进有出,先进后出的总方案数(说白了就是个栈)

那么问题来了,为什么这类问题的答案就是catalan数呢?看我再贴个证明

证明:

令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数。显然含n个1、n个0的2n位二进制数共有个,下面考虑不满足要求的数目。

考虑一个含n个1、n个0的2n位二进制数,扫描到第2m+1位上时有m+1个0和m个1(容易证明一定存在这样的情况),则后面的0-1排列中必有n-m个1和n-m-1个0。将2m+2及其以后的部分0变成1、1变成0,则对应一个n+1个0和n-1个1的二进制数。反之亦然(相似的思路证明两者一一对应)。

从而。证毕。

卧槽复制的时候看看觉得眼熟才发现原来以前在书上看到过(扶额)


然后我们当然也要知道怎么求的啦,说说求大catalan数的两种情况:

  1. 取模:筛质因数后统计各质数的指数神奇地绕过了除法求取模catalan数(反正我是给自己看的 我自己都快看不懂了)简单来说就是 将通项公式上下进行质因数分解,删掉相同的质因数,最后乘出来就行了。然后就用bzoj1485测了下就过了。
  2. 不取模:当然就是要写高精度了_(:3 」∠)_,不过貌似也可以用上面的方法来绕过除法吧,就可以少写个除法高精度了_(:3 」∠)_,还没写,过段时间再回来测= =,顺便贴个网址 http://www.cppblog.com/MiYu/archive/2010/08/08/122674.html

catalan数就到这里了,大部分都是贴维基的啦。还剩下stirling数,本来想一次写完的,我还是先去睡觉好了,改成分上下篇就好。。。







你可能感兴趣的:(catalan数与stirling数学习笔记(上))