Count the Trees

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1248    Accepted Submission(s): 812

Problem Description
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 exactly n 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 number n ( 1 ≤ n ≤ 100 ) 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

Source
UVA

Recommend
Eddy

If the N nodes are the same,there are h[N] different kinds of shapes.h[N] is the n-th Catalan Number.Now the N nodes are labled from 1 to N,so frac(N) should be multiplied.

#include<iostream>
using namespace std;
#ifndef HUGEINT
#define HUGEINT
#include<string>
using namespace std;
class hugeint
{
friend istream operator>> (istream&,hugeint&);
friend ostream operator<< (ostream&,hugeint&);
public:
hugeint()
{
len=0;
memset(num,0,sizeof(num));
}
hugeint(int x)
{
int p;
memset(num,0,sizeof(num));
p=x;
len=0;
while (p>0)
{
len++;
num[len]=p%10;
p/=10;
}
}
hugeint(string s)
{
int i;
len=s.size();
for (i=1;i<=len;i++)
num[i]=int(s[len-i])-48;
}
istream& operator >> (istream& is)
{
int i;
is>>s;
len=s.size();
for (i=1;i<=len;i++)
num[i]=int(s[len-i])-48;
return is;
}
ostream& operator << (ostream& os)
{
int i;
for (i=len;i>=1;i--)
cout<<num[i];
return os;
}
void clear()
{
int i;
for (i=1;i<=len;i++)
{
num[i+1]+=num[i]/10;
num[i]%=10;
}
while ((num[len]==0)&&(len>1)) len--;
}
int compare(hugeint t)
{
int i;
(*this).clear();
t.clear();
if (len>t.len) return 1;
if (len<t.len) return -1;
for (i=len;i>=1;i--)
{
if (num[i]>t.num[i]) return 1;
if (num[i]<t.num[i]) return -1;
}
return 0;
}
hugeint operator = (hugeint t)
{
int i;
len=t.len;
for (i=1;i<=len;i++)
num[i]=t.num[i];
return *this;
}
hugeint operator + (hugeint t)
{
int i;
if (t.len>len) len=t.len;
for (i=1;i<=t.len;i++) num[i]+=t.num[i];
len++;
(*this).clear();
return *this;
}
hugeint operator - (hugeint t)
{
hugeint temp;
int i;
if ((*this).compare(t)<0)
{
temp=t;
t=(*this);
}
else temp=(*this);
for (i=1;i<=temp.len;i++)
{
temp.num[i+1]--;
temp.num[i]+=(10-t.num[i]);
}
temp.clear();
return temp;
}
hugeint operator * (hugeint t)
{
hugeint temp;
int i,j;
for (i=1;i<=(*this).len;i++)
for (j=1;j<=t.len;j++)
temp.num[i+j-1]+=(*this).num[i]*t.num[j];
temp.len=(*this).len+t.len;
temp.clear();
return temp;
}
hugeint operator / (hugeint t)
{
hugeint c=0,d=0;
int i,j,p;
c.len=(*this).len; d.len=1;
for (j=(*this).len;j>=1;j--)
{
d.len++;
for (p=d.len;p>=2;p--)
d.num[p]=d.num[p-1];
d.num[1]=(*this).num[j];
while (d.compare(t)>=0)
{
c.num[j]++;
d=d-t;
}
}
c.clear();
d.clear();
return c;
}
hugeint operator % (hugeint t)
{
hugeint c,d;
int i,j,p;
for (i=1;i<=1000;i++) c.num[i]=0;
for (i=1;i<=1000;i++) d.num[i]=0;
c.len=len; d.len=1;
for (j=len;j>=1;j--)
{
d.len++;
for (p=d.len;p>=2;p--)
d.num[p]=d.num[p-1];
d.num[1]=num[j];
while (d.compare(t)>=0)
{
c.num[j]++;
d=d-t;
}
}
c.clear();
d.clear();
return d;
}
hugeint operator ++ ()
{
(*this)=(*this)+1;
return *this;
}
hugeint operator -- ()
{
(*this)=(*this)-1;
return *this;
}
hugeint operator += (hugeint t)
{
(*this)=(*this)+t;
return *this;
}
hugeint operator -= (hugeint t)
{
(*this)=(*this)-t;
return *this;
}
hugeint operator *= (hugeint t)
{
(*this)=(*this)*t;
return *this;
}
hugeint operator /= (hugeint t)
{
(*this)=(*this)/t;
return *this;
}
hugeint operator %= (hugeint t)
{
(*this)=(*this)%t;
return *this;
}
bool operator == (hugeint t)
{
int i;
if (len!=t.len) return false;
for (i=1;i<=len;i++)
if (num[i]!=t.num[i]) return false;
return true;
}
bool operator >= (hugeint t)
{
int x;
x=(*this).compare(t);
if (x>=0) return true;
return false;
}
bool operator <= (hugeint t)
{
int x;
x=(*this).compare(t);
if (x<=0) return true;
return false;
}
bool operator > (hugeint t)
{
int x;
x=(*this).compare(t);
if (x>0) return true;
return false;
}
bool operator < (hugeint t)
{
int x;
x=(*this).compare(t);
if (x<0) return true;
return false;
}
~hugeint() {}
private:
int num[1001];
int len;
string s;
};
#endif
hugeint h[125];
hugeint frac[125];
int i,N;
int main()
{
frac[0]=1;
h[0]=1;
for (i=1;i<=100;i++) frac[i]=frac[i-1]*i;
for (i=1;i<=100;i++)
{
h[i]=h[i-1]*(4*i-2);
hugeint tmp=i+1;
h[i]=h[i]/tmp;
}
while (scanf("%d",&N)!=EOF)
{
if (N==0) return 0;
hugeint ans=frac[N]*h[N];
ans<<cout;
cout<<endl;
}
return 0;
}

Count the Trees[HDU1131]的更多相关文章

  1. zjuoj 3602 Count the Trees

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 Count the Trees Time Limit: 2 Seco ...

  2. Uva 10007 / HDU 1131 - Count the Trees (卡特兰数)

     Count the Trees  Another common social inability is known as ACM (Abnormally Compulsive Meditation) ...

  3. TZOJ 4292 Count the Trees(树hash)

    描述 A binary tree is a tree data structure in which each node has at most two child nodes, usually di ...

  4. HDU 1131 Count the Trees 大数计算

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

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

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

  6. uva 10007 Count the Trees

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

  7. HDU 1131 Count the Trees

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

  8. ZOJ3602:Count the Trees

    我是在neuqvj上交的这题:http://vj.acmclub.cn/problem/viewProblem.action?id=17848 本来是挺容易的树同构题,可是节点数比较多,愣是把普通ha ...

  9. 2012-2014 三年浙江 acm 省赛 题目 分类

    The 9th Zhejiang Provincial Collegiate Programming Contest A    Taxi Fare    25.57% (166/649)     (水 ...

随机推荐

  1. HDU 3998 Sequence(经典问题,最长上升子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 解题报告:求一个数列的最长上升子序列,并求像这样长的不相交的子序列最多有多少个. 我用的是最简单 ...

  2. 谷歌浏览器 DEV Tools

    谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器.伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chrome变成了一个必须的工具.大多数可能熟悉关于chorme的许多特点,例如使用c ...

  3. HDOJ 1162

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  4. [BZOJ]1016 JSOI2008 最小生成树计数

    最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...

  5. MySql 插入数据中文乱码

    在数据库连接URL后加上characterEncoding=UTF-8 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ssm ...

  6. 开发Web Service的几种方式

    本文作者在学习使用Java开发Web Service(不包括Restful)时,由于不知道Java有这么多框架支持开发Web Service一度陷入迷惘,不知道这些框架各有 什么不同,各有什么优缺点. ...

  7. 《转》Visual Studio 2010 终极定制安装精简方法

    打开VS2010安装目录下的 Setup 文件夹,找到 baseline.dat 文件和 vs_setup.pdi 文件还有一个 locdata.ini 文件,是对应的. 这些都是文本文件,用记事本就 ...

  8. 动态设置Div坐标

    <style type="text/css"> #main{text-align:center; background-color:#9FF; height:600px ...

  9. 【leetcode】Subsets

    Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...

  10. ajax:post 400错误

    POST http://localhost:8080/purchase/purchase-apply/update.htm 400 (Bad Request) n.ajaxTransport.k.co ...