Count the Trees 

Another common social inability is known as ACM (Abnormally Compulsive Meditation). This psychological disorder is somewhat common among programmers. It can be described as the temporary (although frequent) loss of the faculty of speech when the whole power of the brain is applied to something extremely interesting or challenging.

Juan is a very gifted programmer, and has a severe case of ACM (he even participated in an ACM world championship a few months ago). Lately, his loved ones are worried about him, because he has found a new exciting problem to exercise his intellectual powers, and he has been speechless for several weeks now. The problem is the determination of the number of different labeled binary trees that can be built using exactlyn different elements.

For example, given one element A, just one binary tree can be formed (using A as the root of the tree). With two elements, A and B, four different binary trees can be created, as shown in the figure.

 

If you are able to provide a solution for this problem, Juan will be able to talk again, and his friends and family will be forever grateful.

Input

The input will consist of several input cases, one per line. Each input case will be specified by the numbern ( 1 ≤ n ≤ 300 ) of different elements that must be used to form the trees. A number 0 will mark the end of input and is not to be processed.

Output

For each input case print the number of binary trees that can be built using the n elements, followed by a newline character.

Sample Input

1
2
10
25
0

Sample Output

1
4
60949324800
75414671852339208296275849248768000000

Miguel Revilla 
2000-08-21
 

解题思路:result(n) = Canlatan(n)*n!

这题完全是水过去的,给你的测试数据前两个还是可以算出来,但第三个数据以后就很大了,因为是Cantalan的一个系列,所以我试出了10的sampleOutput刚好是:10的阶乘*Cantalan数,然后计算了25的输出,发现也是如此,在原有的代码上稍加改进在杭电过了之后交到了Uva,Uva的数据比较大 n<=300

 #include<cstdio>
#include<cstring>
#define SIZE 200
#define MAXN 302
#define BASE 10000 using namespace std; int Canlan[MAXN][SIZE];
int temp[SIZE]; void A(int n)
{
memcpy(temp, Canlan[n], sizeof(temp));
int e = ;
for(int fac = n; fac>; --fac)
{
for(int i = SIZE-, remain = ; i>=; --i)
{
e = temp[i] * fac + remain;
temp[i] = e % BASE;
remain = e / BASE;
}
}
memcpy(Canlan[n], temp, sizeof(int)*SIZE);
} void multiply(int elem)
{
for(int i=SIZE-, remain = ; i >= ; --i)
{
remain = temp[i] * elem + remain;
temp[i] = remain % BASE;
remain = remain / BASE;
}
return;
} void divide(int elem)
{
int i;
for(i=; i<SIZE && temp[i] == ; i++);
for(int remain = ; i < SIZE; ++i)
{
remain += temp[i];
temp[i] = remain / elem;
remain = (remain % elem) * BASE;
}
return;
} void Cantalan()
{
memset(Canlan[], , sizeof(int)*SIZE);
Canlan[][SIZE-] = ;
for(int i=; i<MAXN; ++i)
{
memcpy(temp, Canlan[i-], sizeof(int)*SIZE);
multiply(*i-);
divide(i+);
memcpy(Canlan[i], temp, sizeof(int)*SIZE);
}
return;
} int main()
{
int n;
Cantalan();
for(int i=; i<MAXN; ++i) A(i);
while(scanf("%d", &n) != EOF && n)
{
int i;
for(i=; i<SIZE && Canlan[n][i] == ; i++);
printf("%d", Canlan[n][i]);
if(i+ == SIZE)
{
printf("\n");
continue;
}
for(i=i+; i<SIZE; ++i)
printf("%04d", Canlan[n][i]);
printf("\n");
}
return ;
}

Uva 10007 / HDU 1131 - Count the Trees (卡特兰数)的更多相关文章

  1. HDU 1131 Count the Trees 大数计算

    题目是说给出一个数字,然后以1到这个数为序号当做二叉树的结点,问总共有几种组成二叉树的方式.这个题就是用卡特兰数算出个数,然后因为有编号,不同的编号对应不同的方式,所以结果是卡特兰数乘这个数的阶乘种方 ...

  2. HDU 1131 Count the Trees

    卡特兰数再乘上n的阶乘 #include<iostream> #include<cstdio> using namespace std; #define base 10000 ...

  3. hdu 1130How Many Trees?(卡特兰数)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为(从第零 ...

  4. uva 1478 - Delta Wave(递推+大数+卡特兰数+组合数学)

    option=com_onlinejudge&Itemid=8&category=471&page=show_problem&problem=4224" st ...

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

    题意: 给出一个数字n,假设火车从1~n的顺序分别进站,求有多少种出站序列. 思路: 卡特兰数的经典例子.n<101,用递推式解决.需要使用到大数.n=100时大概有200位以下. #inclu ...

  6. HDU 1133 Buy the Ticket 卡特兰数

    设50元的人为+1 100元的人为-1 满足前随意k个人的和大于等于0 卡特兰数 C(n+m, m)-C(n+m, m+1)*n!*m! import java.math.*; import java ...

  7. 【HDU 5184】 Brackets (卡特兰数)

    Brackets Problem Description We give the following inductive definition of a “regular brackets” sequ ...

  8. UVa 10007 - Count the Trees(卡特兰数+阶乘+大数)

    题目链接:UVa 10007 题意:统计n个节点的二叉树的个数 1个节点形成的二叉树的形状个数为:1 2个节点形成的二叉树的形状个数为:2 3个节点形成的二叉树的形状个数为:5 4个节点形成的二叉树的 ...

  9. uva 10007 Count the Trees

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. [POJ1050]To the Max(最大子矩阵,DP)

    题目链接:http://poj.org/problem?id=1050 发现这个题没有写过题解,现在补上吧,思路挺经典的. 思路就是枚举所有的连续的连续的行,比如1 2 3 4 12 23 34 45 ...

  2. mysql中的去除空格函数

    (1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例:update `ne ...

  3. tomcat启动时报:IOException while loading persisted sessions: java.io.EOFException的解决方案

    错误代码如下: 严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException ...

  4. 51nod1244 莫比乌斯函数之和

    推公式.f[n]=1-∑f[n/i](i=2...n).然后递归+记忆化搜索.yyl说这叫杜教筛?时间复杂度貌似是O(n 2/3)的? #include<cstdio> #include& ...

  5. Storm的容错性

    一.简介 如果在消息处理过程中出了一些异常,Storm 会重新安排这个出问题的 topology.Storm 保证一个 topology 永远运行(除非你显式杀掉这个 topology) . 当然,如 ...

  6. USACO全部测试数据

    链接:http://share.weiyun.com/8c37d26066ee9e63147d2af983f24290 密码:YyGL 请使用2345好压解压.

  7. appserver配置虚拟主机

    1, apach配置文件开启虚拟主机服务(C:\AppServ\Apache2.2\conf\httpd.conf)大概561行的位置 # Virtual hostsInclude conf/extr ...

  8. MySQL表类型

    学习Mysql数据库,Mysql表类型都有哪些是一定需要知道的,下面就为您介绍七种Mysql表类型,希望能对您学习Mysql表类型有所帮助. MySQL作为当前最为流行的免费数据库服务引擎,已经风靡了 ...

  9. linux下安装虚拟机qemu kqemu

    一,为什么要装虚拟机,为什么选择qemu 我的系统里面有3个linux系统,这些系统都是独立的,有的时候,我想一台电脑,能更真实的模拟二台,这个时候我们就可以装个虚拟机.其实如果真的很有钱的话,可能考 ...

  10. 配置apache以fastcgi运行php

    apache默认是用自带的mod_php模块运行php,现在我们介绍使用fastcgi来执行php脚本.先说下fastcgi的优点: Fastcgi的优点: 从稳定性上看, fastcgi是以独立的进 ...