Count the Trees[HDU1131]
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]的更多相关文章
- zjuoj 3602 Count the Trees
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 Count the Trees Time Limit: 2 Seco ...
- Uva 10007 / HDU 1131 - Count the Trees (卡特兰数)
Count the Trees Another common social inability is known as ACM (Abnormally Compulsive Meditation) ...
- 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 ...
- HDU 1131 Count the Trees 大数计算
题目是说给出一个数字,然后以1到这个数为序号当做二叉树的结点,问总共有几种组成二叉树的方式.这个题就是用卡特兰数算出个数,然后因为有编号,不同的编号对应不同的方式,所以结果是卡特兰数乘这个数的阶乘种方 ...
- UVa 10007 - Count the Trees(卡特兰数+阶乘+大数)
题目链接:UVa 10007 题意:统计n个节点的二叉树的个数 1个节点形成的二叉树的形状个数为:1 2个节点形成的二叉树的形状个数为:2 3个节点形成的二叉树的形状个数为:5 4个节点形成的二叉树的 ...
- uva 10007 Count the Trees
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- HDU 1131 Count the Trees
卡特兰数再乘上n的阶乘 #include<iostream> #include<cstdio> using namespace std; #define base 10000 ...
- ZOJ3602:Count the Trees
我是在neuqvj上交的这题:http://vj.acmclub.cn/problem/viewProblem.action?id=17848 本来是挺容易的树同构题,可是节点数比较多,愣是把普通ha ...
- 2012-2014 三年浙江 acm 省赛 题目 分类
The 9th Zhejiang Provincial Collegiate Programming Contest A Taxi Fare 25.57% (166/649) (水 ...
随机推荐
- 我的grub.cfg配置文件
路径:/boot/grub/grub.cfg 配置文件如下: # # DO NOT EDIT THIS FILE # # It is automatically generated by grub-m ...
- ruby代码重构第二课
(文章都是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在第一课里提取出了相通的代码,第二课里就把常量提取出来吧 一般把常量的定义写的对应的app/mo ...
- PHP 基础语法实例及注意事项
<?$varint = 1;$varinteger = "test";$varstring = "tes";$varbool = true;$varflo ...
- 暑假热身 B. 下载测速
最近,nono终于结束了每年一次的为期12个月的冬眠,醒来的第一件事就是——看电影!!nono发现最近一年出现了各种很好很强大的电影,例如这个.这个.还有这个. 于是nono直接把这些电影全部扔进了下 ...
- sed替换字符串时,使用正则表达式的注意事项
sed的使用方法为: 使用单个模式替换:sed 's/pattern/replacement/flags' filename,例如echo 'abc' | sed 's/a/A/'-->Abc ...
- jstack命令详解
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...
- scp失效问题
1.症状 (1)登陆到服务器A(已在本机用ssh-add, ssh -A),scp 到服务器B时提示public key有问题: (2)/tmp/下没有ssh-XXX目录 2.原因 服务器A被pupp ...
- 1.python基础入门
作者:刘耀 出处:http://www.yaomr.com 欢迎转载 提示: 语法基于python3.5版本(会提示2.7版本和3.5版本的区别) Python命令行将以>>>开始, ...
- 【python】pathlib库
pathlib在python3.2以上开始默认支持,在python2.7中如果要使用需要安装 pip install pathlib pathlib更多参考资料:http://pathlib.read ...
- 【python】linux将python改为默认3.4版本
Python3.4默认是安装在/usr/local/lib/python3.4目录下,需要删除默认python link文件,重新建立连接关系. 使用ln -s命令来修改,命令如下: sudo rm ...