杭电ACM1130——How Many Tree?~~Catalan数

Catalan数的递推公式为:F(n)= F(n - 1) * (4*n - 2)/ (n + 1);

由于n最大为100;所以需要用数组来存放每一个Catalan数。需要运用大数的运算。

下面的是AC 的代码:

# include <stdio.h>

struct catalan
{
	int length;
	int len[100];
};

struct catalan a[101];
int main()
{
	a[0].length = 1; a[0].len[0] = 1;              //前4个Catalan数
	a[1].length = 1; a[1].len[0] = 1;
	a[2].length = 1; a[2].len[0] = 2;
	a[3].length = 1; a[3].len[0] = 5;
	int i, j, k, num, n, yu, div;
	for(i = 4; i <= 100; i++)
	{
		num = 4 * i - 2; k = 0; yu = 0; div = 0;
		a[i].length = 0;
		for(j = 0; j < a[i - 1].length; j++)       //根据公式,先乘以4 * i - 2;采用一位一存的方法。
		{
			a[i].len[k] = (a[i - 1].len[j] * num + yu) % 10;
			yu = (a[i - 1].len[j] * num + yu) / 10;
			k++;
		}
		while(yu)                                  //余数不为0;继续补上
		{
			a[i].len[k] = yu % 10;
			yu = yu / 10;
			k++;
		}
		a[i].length = k;
		for(j = a[i].length - 1; j >= 0; j--)      //根据公式,除以i + 1,运用的是大数除以一个小数。
		{
			div = div * 10 + a[i].len[j];
			a[i].len[j] = div / (i + 1);
			div = div % (i + 1);
		}
		while(!a[i].len[a[i].length])              //去掉前置的0.
			a[i].length--;
		a[i].length++;
	}
	while(scanf("%d", &n) != EOF)
	{
		for(i = a[n].length - 1; i >= 0; i--)
			printf("%d", a[n].len[i]);
		printf("\n");
	}
	return 0;
}
时间: 2024-10-18 00:10:34

杭电ACM1130——How Many Tree?~~Catalan数的相关文章

杭电 HDU ACM 1282 回文数猜想

回文数猜想 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4940    Accepted Submission(s): 2958 Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不

杭电 1280 前m大的数

http://acm.hdu.edu.cn/showproblem.php?pid=1280 前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10382    Accepted Submission(s): 3614 Problem Description 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实

杭电OJ_hdu3290_The magic apple tree

题目大意:给出一个有N(0<N<=20000)个节点的苹果树,这个树只有1个root(根节点),每个节点都有1个label(编号),label从1开始一直到N.苹果树的每个节点按照如下规则生长苹果: 1.叶子节点生长出的苹果数量等于叶子节点的label. 2.某父亲节点有K个儿子节点,直到它的K个儿子节点都生长出苹果,父亲节点才开始生长苹果.父亲节点长出的苹果数量等于它的  所有儿子中苹果数量第(k+1)/2小的  儿子节点的苹果数量. 求根节点生长出的苹果数量. 举个栗子:如下图所示,lab

杭电(hdu)ACM 2084 数塔

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 27978    Accepted Submission(s): 16819 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

杭电ACM2092--整数解

杭电ACM2092--整数解    分析 http://acm.hdu.edu.cn/showproblem.php?pid=2092 一个YES,一个Yes.试了10几次..我也是无语了..哪里都不错的.... 很简单,用2次求根公式求出其中一个的值,然后判断是否为整数    if (x == int(x) ). 或者  用最直接的方法,从-m到m挨个算.有意结果时停止. 源码: #include <stdio.h> #include <math.h> int main() {

不可摸数(杭电1999)

/*不可摸数 Problem Description s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何 数m,s(m)都不等于n,则称n为不可摸数. Input 包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数. Output 如果n是不可摸数,输出yes,否则输出no Sample Input 3 2 5 8 Sample Output yes yes no */ /*用打表法将 n的真因子

Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解)

Problem Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties. There is exactly one node, called the

杭电1280(前m大的数)

点击打开杭电1280 Problem Description 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答案中最大的M个数告诉她就可以了. 给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的顺序排列. Input 输入可能包含多组数据,其中每组数据包括

不可摸数 【杭电-1999】 附题

/* hdu 1999 不可摸数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8274    Accepted Submission(s): 2122 Problem Description s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何 数m,s(m)都不等于n,则称n