卡特兰数简单应用

f[n+1]=(4*n+2)/(n+2)*f[n];

由f[n]=C(n,2n)-C(n+1,2n)推导

然后就是一些大数乘法和大数除法了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <sstream>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
#define base 10000

int g[110][110];

void mmul(int s[],int tmp,int t[])
{
    for(int i=0;i<100;i++)
    {
        t[i]=s[i]*tmp;
    }
    for(int i=0;i<100;i++)
    {
        t[i+1]+=t[i]/base;
        t[i]%=base;
    }
}

void mdiv(int s[],int tmp)
{
    int d;
    for(int i=100;i>=0;i--)
    {
        d=s[i]%tmp;
        s[i]=s[i]/tmp;
        if(i!=0)
            s[i-1] += d*base;
    }

}


int main()
{
    //freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
    //freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
    int n;
    g[1][0]=1;
    for(int i=2;i<=100;i++)
    {
        int up=4*(i-1)+2;
        mmul(g[i-1],up,g[i]);
        int down=i+1;
        mdiv(g[i],down);
        //mmul(g[i],i,g[i]); 这一步看要不要阶层
    }
    while(scanf("%d",&n)&&n)
    {
        int i;
        for(i=100;i>=0;i--)
            if(g[n][i]!=0) break;
        printf("%d",g[n][i]);
        i--;
        for(;i>=0;i--)
            printf("%04d",g[n][i]);
        printf("\n");
    }
    return 0;
}

 

posted @ 2013-07-18 21:11  chenhuan001  阅读(303)  评论(0编辑  收藏  举报