vijosP1388 二叉树数

链接:https://vijos.org/p/1388

【思路】

Catalan数。根据公式h=C(2n,n)/(n+1)计算。首先化简为 (n+i)/i的积(1<=i<=n)

法一:

高精单精乘除。

法二:

唯一分解定理。将乘除操作转化为对质因子指数的加减,最后用高精单精乘起来。类于vijosP1137 组合数一题

【代码1】439ms

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4.  
  5. struct Bign {
  6. int len;
  7. long long N[];
  8. Bign() {
  9. memset(N,,sizeof(N));
  10. }
  11. };
  12.  
  13. int n;
  14.  
  15. void multi(Bign& a,int x)
  16. {
  17. for(int j=;j<a.len;j++) a.N[j] *= x;
  18. int i=;
  19. while(i<a.len || a.N[i]>) {
  20. a.N[i+] += a.N[i]/;
  21. a.N[i] %= ;
  22. i++; //i++
  23. }
  24. if(a.N[i]) a.len=i+; //判断
  25. else a.len=i;
  26. }
  27.  
  28. void div(Bign& a,int x) {
  29. for(int i=a.len-;i>;i--) { //由高位到低位
  30. a.N[i-] += a.N[i]%x*;
  31. a.N[i] /= x;
  32. }
  33. a.N[]/=x; //最后一位
  34. while(a.N[a.len-]==) a.len--; //删除前导0
  35. }
  36.  
  37. int main() {
  38. cin>>n;
  39. Bign ans;
  40. ans.len=; ans.N[]=;
  41. for(int i=;i<=n;i++) {
  42. multi(ans,n+i);
  43. div(ans,i);
  44. }
  45. div(ans,n+);
  46. for(int i=ans.len-;i>=;i--) cout<<ans.N[i];
  47. return ;
  48. }

【代码2】52ms

  1. #include<iostream>
  2. #include<cstring>
  3. #include<vector>
  4. #include<cmath>
  5. using namespace std;
  6.  
  7. const int maxn = +;
  8. struct Bign{
  9. int len,N[maxn];
  10. Bign() {
  11. memset(N,,sizeof(N));
  12. }
  13. };
  14. int e[maxn];
  15. int n,m,ans;
  16. vector<int> primes;
  17.  
  18. void get_primes(int n) {
  19. bool su[maxn]; memset(su,true,sizeof(su));
  20. for(int i=;i<=n;i++) if(su[i]) {
  21. primes.push_back(i);
  22. if(i<=sqrt(n)) for(int j=i*i;j<=n;j+=i) su[j]=false;
  23. //i<=sqrt(n) 否则RE
  24. }
  25. }
  26.  
  27. void calc(int x,int d) {
  28. for(int i=;i<primes.size();i++) {
  29. while(x%primes[i]==) {
  30. e[i] += d;
  31. x /= primes[i];
  32. }
  33. if(x==) break;
  34. }
  35. }
  36.  
  37. void multi(Bign& a,int x)
  38. {
  39. for(int j=;j<a.len;j++) a.N[j] *= x;
  40. int i=;
  41. while(i<a.len || a.N[i]>) {
  42. a.N[i+] += a.N[i]/;
  43. a.N[i] %= ;
  44. i++; //i++
  45. }
  46. if(a.N[i]) a.len=i+; //判断
  47. else a.len=i;
  48. }
  49.  
  50. int main() {
  51. cin>>n;
  52.  
  53. get_primes(*n+);
  54.  
  55. for(int i=;i<=n;i++) {
  56. calc(n+i,);
  57. calc(i,-);
  58. }
  59. calc(n+,-);
  60. Bign ans; ans.len=; ans.N[]=;
  61. for(int i=;i<primes.size();i++){
  62. while(e[i]--) multi(ans,primes[i]);
  63. }
  64. for(int i=ans.len-;i>=;i--) cout<<ans.N[i];
  65. return ;
  66. }

vijosP1388 二叉树数的更多相关文章

  1. leetCode之二叉树数中序遍历(递归实现)

    1.题目描述 2.分析 对于树来说,由于其结构是递归定义的,所以对二叉树很多算法使用递归是最容易的.反倒是使用循环方式需要借助特殊的数据结构来实现. 3.代码 vector<int> in ...

  2. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  3. leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree

    leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree 1 题目 Binary Search Tre ...

  4. 后序线索化二叉树(Java版)

    前面介绍了前序线索化二叉树.中序线索化二叉树,本文将介绍后序线索化二叉树.之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序.中序要复杂一些:另外在复习线索化二叉树的过程中,大 ...

  5. LeetCode222 Count CompleteTree Nodes(计算全然二叉树的节点数) Java 题解

    题目: Given a complete binary tree, count the number of nodes. Definition of a complete binary tree fr ...

  6. N个节点的二叉树有多少种形态(卡特兰数)

    N个节点的二叉树有多少种形态   这是一道阿里的面试题.其实算不上新鲜,但是我之前没关注过,如今碰到了,就顺便探讨下这个问题吧:) 拿到这个题,首先想到的是直接写出表达式肯定不行,所以有必要从递推入手 ...

  7. C++计算二叉树的节点数和高度

    用struct结构体的写法: /* * description: 计算二叉树的层数和节点数 * writeby: nick * date: 2012-10-23 16:16 * */ #include ...

  8. [Catalan数]1086 栈、3112 二叉树计数、3134 Circle

    1086 栈 2003年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 栈是计算机中 ...

  9. 长沙理工大学第十二届ACM大赛-重现赛 大家一起来数二叉树吧 (组合计数)

    大意: 求n结点m叶子二叉树个数. 直接暴力, $dp[i][j][k][l]$表示第$i$层共$j$节点, 共$k$叶子, 第$i$层有$l$个叶子的方案数, 然后暴力枚举第$i$层出度为1和出度为 ...

随机推荐

  1. MongoDB源码分析——mongo与JavaScript交互

    mongo与JavaScript交互 源码版本为MongoDB 2.6分支     之前已经说过mongo是MongoDB提供的一个执行JavaScript脚本的客户端工具,执行js其实就是一个js和 ...

  2. Mantle 简单教程

    Mantle可以很方便的去书写一个模型层的代码. 使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议) ...

  3. jQuery弹出层_点击自身以外地方关闭弹出层

    <html> <style> .hide{display:none;} </style> <script type="text/javascript ...

  4. setTimeout和setInterval的深入理解

    以前写的setTimeout和setInterval的文章有些不足之处,今天抽时间整理了一下,要想真正理解还得从javascript的单线程机制说起 大概半年前发表过一篇关于setTimeout和se ...

  5. 安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined

    安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined 出现这种错误是因为主机名和/etc/host ...

  6. Android中的pix,sp,dp相关概念

    px( pixel) 像素,可以简单的理解为一个点或方块,用以颜色的显示(单位),一般指印刷品或屏幕设置设备的颜色显示定义. dip(device independent pixels)设备独立像素. ...

  7. C#网页自动登录和提交POST信息的多种方法(转)

    网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提取网页HTML的组件比较多,常用的用WebBrowser.WebClient.HttpWebRequest这三 ...

  8. 二维卷积c代码

    二维卷积c代码 二维信号的卷积原理请参考另外一篇文章:http://blog.csdn.net/carson2005/article/details/43702241 这里直接给出参考代码: void ...

  9. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

  10. 【HDU 3435】 A new Graph Game (KM|费用流)

    A new Graph Game Problem Description An undirected graph is a graph in which the nodes are connected ...