hdu acm 1023 Train Problem II ->卡特兰(Catalan大数)

#include<iostream>
using namespace std;

struct Node        //节点
{
	int num[105];
	int len;           //数的长度
} a[105];

void CalCatalen()   //卡特兰数计算
{
	int i,j,len,c,t;   //len长度,c进位

	a[1].num[0]=a[1].len=1;
	len=1;
	for(i=2;i<=100;i++)
	{
		for(j=0;j<len;j++)         //乘法,分子部分
			a[i].num[j]=a[i-1].num[j]*(4*i-2);
		c=0;
		for(j=0;j<len;j++)  //处理相乘结果
		{
			t=a[i].num[j]+c;
			a[i].num[j]=t%10;
			c=t/10;
		}
		while(c)     //处理进位
		{
			a[i].num[len++]=c%10;
			c/=10;
		}
		c=0;
		for(j=len-1;j>=0;j--)   //除法,分母部分
		{
			t=c*10+a[i].num[j];
			a[i].num[j]=t/(i+1);
			c=t%(i+1);
		}
		while(!a[i].num[len-1])  //高位0处理
			len--;
		a[i].len=len;
	}
}

int main()
{
	int i,n;

	CalCatalen();  //卡特兰数打表
	while(scanf("%d",&n)==1)
	{
		for(i=a[n].len-1;i>=0;i--)
			cout<<a[n].num[i];
		cout<<endl;
	}
    return 0;
}

参考自:http://blog.csdn.net/niushuai666/article/details/6936859

卡特兰数

卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。

卡特兰公式的应用很广泛,最典型的四种应用问题现描述如下:

1.括号化问题。

矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

2.出栈次序问题。

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

  类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

3.将多边行划分为三角形问题。

  将一个凸多边形区域分成三角形区域的方法数?

  类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

      类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

4.给顶节点组成二叉树的问题。

  给定N个节点,能构成多少种不同的二叉树?

Catalan数的解法

1.Catalan数的组合公式为 Cn=C(2n,n) / (n+1);

2.此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)。

令h(1)=1,h(0)=1,catalan数满足递归式:

  h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)

  例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

  h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(1)=1*2+1*1+2*1=5

  另类递归式:

  h(n)=h(n-1)*(4*n-2)/(n+1);

  该递推关系的解为:

  h(n)=C(2n,n)/(n+1) (n=1,2,3,...)

时间: 2024-10-13 12:48:56

hdu acm 1023 Train Problem II ->卡特兰(Catalan大数)的相关文章

HDU 1023 Train Problem II (卡特兰数,经典)

题意:给出一个数字n,假设火车从1~n的顺序分别进站,求有多少种出站序列. 思路:卡特兰数的经典例子.n<101,用递推式解决.需要使用到大数.n=100时大概有200位以下. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=101; 4 vector<string> vect; 5 void _mult(string num1, string num2, string &result )

hdoj 1023 Train Problem II 【卡特兰】+【高精度】

题意:询问有多少种进站出站的顺序. 经典卡特兰.我对卡特兰目前的认识就是有n个1和n个-1,组成一个为2n的数列的方式有多少种.这就跟火车进站出站类似, 至于具体的卡特兰数的介绍,百度解释的很详细. 代码1(c语言): /* h(n) = h(n-1)*(4*n-2)/(n+1); */ #include <stdio.h> #include <string.h> #define M 110 int s[M][M] = {0}, b[M]; void init(){ s[1][0]

hdu 1023 Train Problem II 这题运用到大数相乘+大数相除+卡特兰数

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6454    Accepted Submission(s): 3514 Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Stat

hdoj 1023 Train Problem II 【卡特兰数】

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6928    Accepted Submission(s): 3750 Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Stat

Train Problem II 卡特兰裸题(入门题)

Train Problem II  题目大意:给你一个数n,表示有n辆火车,编号从1到n,从远方驶过来,问你有多少种出站的可能. 解题思路:模拟栈的问题而已.  卡特兰问题. 1 import java.math.*; 2 import java.util.*; 3 import java.io.*; 4 5 public class Main 6 { 7 static int MS=101; 8 public static void main(String[] args) 9 { 10 Sca

HDU 1002 A + B Problem II(两个大数相加)

详细题目点击:http://acm.hdu.edu.cn/showproblem.php?pid=1002 Problem Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. Input The first line of the input contains an integer T(1<=T<=20)

1023 Train Problem II(卡特兰数)

Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway. Input The input contains se

HDOJ 1023 Train Problem II (卡塔兰数)

Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway. Input The input contains se

HDU 1023 Train Problem II 大数打表Catalan数

一个出栈有多少种顺序的问题.一般都知道是Catalan数了. 问题是这个Catalan数非常大,故此须要使用高精度计算. 并且打表会速度快非常多.打表公式要熟记: Catalan数公式 Cn=C(2n,n) / (n+1); 递推公式 C(n ) = C(n-1)*(4*n-2) / (n+1) 高精度乘以一个整数和高精度除以一个整数的知识.这样还是使用整数数组比較好计算,假设使用string那么就不太好计算了,由于整数也可能是多位的. const int MAX_N = 101; short