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. Hook入门

    Hook入门 2014-07-24 基本概念 Windows消息机制 Hook(钩子) 运行机制 核心函数 C# hook示例 基本概念[1] Windows消息机制[5] Windows操作系统是建 ...

  2. [转载] 推荐的C++书籍以及阅读顺序

    2014-06-17 转载自 oiramario 的文章 推荐的C++书籍以及阅读顺序 当读者有一定c/c++基础 推荐的阅读顺序: level 1 从<<essential c++> ...

  3. 《OD大数据实战》HBase入门实战

    官方参考文档:http://abloz.com/hbase/book.html#shell_tricks 1.2.3. Shell 练习 用shell连接你的HBase $ ./bin/hbase s ...

  4. 《OD大数据实战》Hadoop伪分布式环境搭建

    一.安装并配置Linux 8. 使用当前root用户创建文件夹,并给/opt/下的所有文件夹及文件赋予775权限,修改用户组为当前用户 mkdir -p /opt/modules mkdir -p / ...

  5. Data.gov.uk电子政务云,牛津大学NIE金融大数据实验室王宁:数据治理的现状和实践

    牛津大学NIE金融大数据实验室王宁:数据治理的现状和实践 我是牛津互联网研究院的研究员,是英国开放互联网的一个主要的研究机构和相关政策制订的一个机构.今天主要给大家介绍一下英国数据治理的一些现状和实践 ...

  6. 创建xml时,设置xml编码问题

    OutputFormat format = OutputFormat.createPrettyPrint();    format.setEncoding("GBK"); XMLW ...

  7. web.xml中webAppRootKey

    ------------------------------------------------------------------------------------------------1. w ...

  8. HDU 3951 (博弈) Coin Game

    先考虑两种简单的情况: 如果先手能一次把硬币拿完,即 k >= n ,那么先手胜 如果每次只能拿一个硬币, 即 k = 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜. 剩下的情况就是 ...

  9. Asp.net中的HttpModule和HttpHandler的简单用法

    在Asp.net中,HttpModule和HttpHandler均可以截取IIS消息进行处理,这使得我们制作人员能够非常方便的进行诸如图片水印添加,图片盗链检查等功能. 下面先就HttpModule的 ...

  10. 【英语】Bingo口语笔记(52) - sleep系列