卡特兰数

83 篇文章 10 订阅
41 篇文章 2 订阅

先放一张图

 在ACM中的例子有:

1.二叉树的计数

2.AB排列问题(n个A和n个B排成一排,从第一个位置开始到任何位置,B的个数不能超过A的个数)

3.乘法加括号(有多少种不同的运算顺序)

4.欧拉多边形分割问题(凸n边形用n-3条不相交的对角线分成n-2个互相没有重叠的三角形)

5.在圆上选择2n个点,将这些点成对链接起来使得所得到的n条线段不相交,一共有多少种方法

6.一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列

7.n*n的方格地图中,从一个角到另外一个角,不跨越对角线的路径数(两个角为对角)

8.n层的阶梯切割为n个矩形的切法数

用递归公式二进行求解

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int hex=10000;

int kat[110][110];

void mul(int k,int num){
    int car=0;
    for(int i=100;i>=0;i--){
        car+=kat[k-1][i]*num;
        kat[k][i]=car%hex;
        car/=hex;
    }
}

void division(int k,int num){
    int car=0;
    for(int i=0;i<=100;i++){
        car=car*hex+kat[k][i];
        kat[k][i]=car/num;
        car%=num;
    }
}

void init(){
    memset(kat,0,sizeof(kat));
    kat[1][100]=1;
    for(int i=2;i<=100;i++){
        int num=4*i-2;
        mul(i,num);
        num=i+1;
        division(i,num);
    }
}

int main(){
    init();
    int n;
    while(scanf("%d",&n)&&n!=-1){
        int pos;
        for(int i=0;i<=100;i++){
            if(kat[n][i]){
                pos=i;
                break;
            }
        }
        printf("%d",kat[n][pos]);
        for(int i=pos+1;i<=100;i++){
            printf("%04d",kat[n][i]);
        }
        printf("\n");
    }
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值