Problem D

How Many Trees?

Input: standard input

Output: standard output

Memory Limit: 32 MB

A binary search tree is a binary tree with root k such that any node v in the left subtree of k has label (v) <label (k) and any node w in the right subtree of k has label (w) > label (k).

When using binary search trees, one can easily look for a node with a given label x: After we compare x to the label of the root, either we found the node we seek or we know which subtree it is in. For most binary search trees the average time to find one of its n nodes in this way is O(log n).

Given a number n, can you tell how many different binary search trees may be constructed with a set of numbers of size n such that each element of the set will be associated to the label of exactly one node in a binary search tree?

Input and Output

The input will contain a number 1 <= i <= 1000 per line representing the number of elements of the set. You have to print a line in the output for each entry with the answer to the previous question.

Sample Input

  1.  
  1. 1
  1. 2
  1. 3

 

Sample Output

  1. 1
  1. 2
  1. 5

题意:给定n个结点,求有几种2叉搜索树。

思路:分别取第n个点做根节点。如此图

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define max(a,b) (a)>(b)?(a):(b)
  4. #define min(a,b) (a)<(b)?(a):(b)
  5. const int N = 1005;
  6. const int MAXBIGN = 1005;
  7.  
  8. struct bign {
  9. int s[MAXBIGN];
  10. int len;
  11. bign() {
  12. len = 1;
  13. memset(s, 0, sizeof(s));
  14. }
  15.  
  16. bign operator = (const char *number) {
  17. len = strlen(number);
  18. for (int i = 0; i < len; i++)
  19. s[len - i - 1] = number[i] - '0';
  20. return *this;
  21. }
  22. bign operator = (const int num) {
  23. char number[N];
  24. sprintf(number, "%d", num);
  25. *this = number;
  26. return *this;
  27. }
  28.  
  29. bign (int number) {*this = number;}
  30. bign (const char* number) {*this = number;}
  31.  
  32. bign operator + (const bign &c){
  33. bign sum;
  34. int t = 0;
  35. sum.len = max(this->len, c.len);
  36. for (int i = 0; i < sum.len; i++) {
  37. if (i < this->len) t += this->s[i];
  38. if (i < c.len) t += c.s[i];
  39. sum.s[i] = t % 10;
  40. t /= 10;
  41. }
  42.  
  43. while (t) {
  44. sum.s[sum.len++] = t % 10;
  45. t /= 10;
  46. }
  47.  
  48. return sum;
  49. }
  50.  
  51. bign operator * (const bign &c){
  52. bign sum; bign zero;
  53. if (*this == zero || c == zero)
  54. return zero;
  55. int i, j;
  56. sum.len = this->len + c.len;
  57. for (i = 0; i < this->len; i++) {
  58. for (j = 0; j < c.len; j ++) {
  59. sum.s[i + j] += this->s[i] * c.s[j];
  60. }
  61. }
  62. for (i = 0; i < sum.len; i ++) {
  63. sum.s[i + 1] += sum.s[i] / 10;
  64. sum.s[i] %= 10;
  65. }
  66. sum.len ++;
  67. while (!sum.s[sum.len - 1]) {
  68. sum.len --;
  69. }
  70. return sum;
  71. }
  72. bign operator * (const int &num) {
  73. bign c = num;
  74. return *this * c;
  75. }
  76. bign operator / (const int &num) {
  77. bign ans; int k = 0;
  78. ans.len = len;
  79. for (int i = ans.len - 1; i >= 0; i --) {
  80. ans.s[i] = (k * 10 + s[i]) / num;
  81. k = (k * 10 + s[i]) % num;
  82. }
  83. while (!ans.s[ans.len - 1]) {
  84. ans.len --;
  85. }
  86. return ans;
  87. }
  88. bign operator - (const bign &c) {
  89. bign ans;
  90. ans.len = max(this->len, c.len);
  91. int i;
  92.  
  93. for (i = 0; i < c.len; i++) {
  94. if (this->s[i] < c.s[i]) {
  95. this->s[i] += 10;
  96. this->s[i + 1]--;
  97. }
  98. ans.s[i] = this->s[i] - c.s[i];
  99. }
  100.  
  101. for (; i < this->len; i++) {
  102. if (this->s[i] < 0) {
  103. this->s[i] += 10;
  104. this->s[i + 1]--;
  105. }
  106. ans.s[i] = this->s[i];
  107. }
  108. while (ans.s[ans.len - 1] == 0) {
  109. ans.len--;
  110. }
  111. if (ans.len == 0) ans.len = 1;
  112. return ans;
  113. }
  114.  
  115. void put() {
  116. if (len == 1 && s[0] == 0) {
  117. printf("0");
  118. } else {
  119. for (int i = len - 1; i >= 0; i--)
  120. printf("%d", s[i]);
  121. }
  122. }
  123.  
  124. bool operator < (const bign& b) const {
  125. if (len != b.len)
  126. return len < b.len;
  127.  
  128. for (int i = len - 1; i >= 0; i--)
  129. if (s[i] != b.s[i])
  130. return s[i] < b.s[i];
  131. return false;
  132. }
  133. bool operator > (const bign& b) const { return b < *this; }
  134. bool operator <= (const bign& b) const { return !(b < *this); }
  135. bool operator >= (const bign& b) const { return !(*this < b); }
  136. bool operator != (const bign& b) const { return b < *this || *this < b;}
  137. bool operator == (const bign& b) const { return !(b != *this); }
  138. };
  139.  
  140. bign f[1005];
  141. int n;
  142.  
  143. void init() {
  144. f[1] = 1;
  145. for (int i = 2; i <= 1000; i ++) {
  146. f[i] = f[i - 1] * (4 * i - 2) / (i + 1);
  147. }
  148. }
  149.  
  150. int main() {
  151. init();
  152. while (~scanf("%d", &n) && n) {
  153. f[n].put();
  154. printf("\n");
  155. }
  156. return 0;
  157. }

UVA 10303 - How Many Trees?(数论 卡特兰数 高精度)的更多相关文章

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

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

  2. HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)

    Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...

  3. hdu 1130 How Many Trees? 【卡特兰数】

    题目 题意:给你一个数字n,问你将1~n这n个数字,可以组成多少棵不同的二叉搜索树. 1,2,5,14--根据输出中的规律可以看出这是一个卡特兰数的序列.于是代用卡特兰数中的一个递推式: 因为输入可取 ...

  4. ACM数论-卡特兰数Catalan

    Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...

  5. hdu 1023 卡特兰数+高精度

    Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. BZOJ2822[AHOI2012]树屋阶梯——卡特兰数+高精度

    题目描述 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为N+1尺(N为 ...

  7. 【BZOJ 2822】2822: [AHOI2012]树屋阶梯(卡特兰数+高精度)

    2822: [AHOI2012]树屋阶梯 Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处 ...

  8. BZOJ2822:[AHOI2012]树屋阶梯(卡特兰数,高精度)

    Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为 ...

  9. bzoj3907 网格 & bzoj2822 [AHOI2012]树屋阶梯——卡特兰数+高精度

    题目:bzoj3907:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 bzoj2822:https://www.lydsy.com/Jud ...

随机推荐

  1. python算法双指针问题:两个有序数组的合并

    最近在看<你也能看得懂的python算法书>, 自己来实现一下里面的算法吧. 有书里的有所不同. 比如这个题目,我的实现如下: from django.test import TestCa ...

  2. django 10.5 sqlite3迁移到mysql

    参考: http://www.voidcn.com/article/p-hesvaooz-ru.html 原文: python ./manage.py syncdb --database slave ...

  3. Hadoop Yarn环境配置

    抄一个可行的Hadoop Yarn环境配置.用的官方的2.2.0版本. http://www.jdon.com/bigdata/yarn.html Hadoop 2.2新特性 将Mapreduce框架 ...

  4. 089实战 Nginx的安装

    1.上传 使用淘宝改进过的nginx 2.解压  tar -zxvf tengine-2.0.2.tar.gz -C ../modules/ 3.进入tegine主目录 4.安装依赖  sudo yu ...

  5. 设计模式之Jdk动态代理

    什么是动态代理呢?就是在java的运行过程中,动态的生成的代理类.(为了更熟悉的了解动态代理,你必须先熟悉代理模式,可点击设计模式之代理模式 阅读)我们知道java属于解释型语言,是在运行过程中,寻找 ...

  6. python json数据处理

    1. python 转 json import json data={ "name":"haha", "age" : 1,"lis ...

  7. P1862输油管道问题

    P1862输油管道问题. . . . .-----------------. . . . . .图像大体是这样,是带权平均数问题,设答案是k,sigama(abs(yi-k*wi))最小,这里的wi是 ...

  8. java enum的一种写法记录

    public enum TestEnum { provider { @Override public void provide() { this.name = "hjzgg"; } ...

  9. Java基础--对象的序列化

    所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数.返回值都必须实现序列化. 比如常见的Dubbo分布式平台,里面的对象实体类必须实现序列化才能在网络间传递 一.定义 序列化:把Java对象转 ...

  10. Css实现元素的垂直居中

    前言: 在写CSS的时候让元素在高度固定的容器中垂直居中是很简单的,譬如设置容器的padding或者元素的margin之类的都可以做到:让元素在容器中水平居中也有text-align:center.m ...