uva 10303 - How Many Trees?(卡特兰数)

迈不过友情╰ 2022-05-14 13:52 236阅读 0赞

题目链接:uva 10303 - How Many Trees?

卡特兰数,公式num[i + 1] = num[i] * (4 * i - 6) / i ( i ≥ 3)。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. using namespace std;
  5. const int N = 6005;
  6. struct bign {
  7. int len, sex;
  8. int s[N];
  9. bign() {
  10. this -> len = 1;
  11. this -> sex = 0;
  12. memset(s, 0, sizeof(s));
  13. }
  14. bign operator = (const char *number) {
  15. int begin = 0;
  16. len = 0;
  17. sex = 1;
  18. if (number[begin] == '-') {
  19. sex = -1;
  20. begin++;
  21. }
  22. else if (number[begin] == '+')
  23. begin++;
  24. for (int j = begin; number[j]; j++)
  25. s[len++] = number[j] - '0';
  26. }
  27. bign operator = (int number) {
  28. char string[N];
  29. sprintf(string, "%d", number);
  30. *this = string;
  31. return *this;
  32. }
  33. bign (int number) {*this = number;}
  34. bign (const char* number) {*this = number;}
  35. bign change(bign cur) {
  36. bign now;
  37. now = cur;
  38. for (int i = 0; i < cur.len; i++)
  39. now.s[i] = cur.s[cur.len - i - 1];
  40. return now;
  41. }
  42. void delZore() { // 删除前导0.
  43. bign now = change(*this);
  44. while (now.s[now.len - 1] == 0 && now.len > 1) {
  45. now.len--;
  46. }
  47. *this = change(now);
  48. }
  49. void put() { // 输出数值。
  50. delZore();
  51. if (sex < 0 && (len != 1 || s[0] != 0))
  52. cout << "-";
  53. for (int i = 0; i < len; i++)
  54. cout << s[i];
  55. }
  56. bign operator * (const bign &cur){
  57. bign sum, a, b;
  58. sum.len = 0;
  59. a = a.change(*this);
  60. b = b.change(cur);
  61. for (int i = 0; i < a.len; i++){
  62. int g = 0;
  63. for (int j = 0; j < b.len; j++){
  64. int x = a.s[i] * b.s[j] + g + sum.s[i + j];
  65. sum.s[i + j] = x % 10;
  66. g = x / 10;
  67. }
  68. sum.len = i + b.len;
  69. while (g){
  70. sum.s[sum.len++] = g % 10;
  71. g = g / 10;
  72. }
  73. }
  74. return sum.change(sum);
  75. }
  76. bign operator / (int k) { // 高精度求商低精度。
  77. bign sum;
  78. sum.len = 0;
  79. int num = 0;
  80. for (int i = 0; i < len; i++) {
  81. num = num * 10 + s[i];
  82. sum.s[sum.len++] = num / k;
  83. num = num % k;
  84. }
  85. return sum;
  86. }
  87. };
  88. bign num[1010];
  89. void init() {
  90. num[3] = 1;
  91. for (int i = 3; i < 1005; i++)
  92. num[i + 1] = num[i] *(4 * i - 6) / i;
  93. }
  94. int main () {
  95. init();
  96. int n;
  97. while (scanf("%d", &n) == 1) {
  98. num[n + 2].put();
  99. printf("\n");
  100. }
  101. return 0;
  102. }

发表评论

表情:
评论列表 (有 0 条评论,236人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    告诉你一个非常好用的方法,你学还是不学? 今天给大家分享的是在组合数学中用途非常广泛的数列,它的名字叫做卡特兰数!!! 下面有道力扣题,如果让你30秒给出答案,你觉得有没有

    相关

     [组合数学:卡特兰数         ][Link 1]    卡特兰数又称卡塔兰数,是[组合数学][Link 2]中一个常出现在各种计数问题中出现的[数列][L

    相关

    卡特兰数是组合数学中的一个重要概念。 卡特兰数可以解决以下四种典型的问题: 1.括号化问题 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用

    相关

    问题引出 若一序列进栈顺序为e1,e2,e3,e4,e5,问存在多少种可能的出栈序列() 问题分析 ![这里写图片描述][70] ![这里写图片描述][70