Description

暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题。由于地上露营湿气重,必须选择在高处的树屋露营。小龙分配的树屋建立在一颗高度为N+1尺(N为正整数)的大树上,正当他发愁怎么爬上去的时候,发现旁边堆满了一些空心四方钢材(如图1.1),经过观察和测量,这些钢材截面的宽和高大小不一,但都是1尺的整数倍,教官命令队员们每人选取N个空心钢材来搭建一个总高度为N尺的阶梯来进入树屋,该阶梯每一步台阶的高度为1尺,宽度也为1尺。如果这些钢材有各种尺寸,且每种尺寸数量充足,那么小龙可以有多少种搭建方法?(注:为了避免夜里踏空,钢材空心的一面绝对不可以向上。)

以树屋高度为4尺、阶梯高度N=3尺为例,小龙一共有如图1.2所示的5种

搭 建方法:

Input

一个正整数 N(1≤N≤500),表示阶梯的高度

Output

一个正整数,表示搭建方法的个数。(注:搭建方法个数可能很大。)

Sample Input

3

Sample Output

5

HINT

1  ≤N≤500

题解

我们令$C_n$表示用$n$个长方形拼成$size$为$n$的三角梯形的方案数。

如题中的图,我们枚举最左下角的点属于哪个长方形。显然有$n$种可能,每种方法又把剩下的部分分成两个三角梯形($size$可能为$0$)。

显然我们得到

$$C_n = \sum _{i = 0} ^{n-1} C_i * C_{n-1-i}$$

其实就是$Catalan$的递推式,我们用通项公式求$C_n$即可。

 1 //It is made by Awson on 2017.10.29
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <string>
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #define LL long long
16 #define Min(a, b) ((a) < (b) ? (a) : (b))
17 #define Max(a, b) ((a) > (b) ? (a) : (b))
18 #define Abs(x) ((x) < 0 ? (-(x)) : (x))
19 using namespace std;
20 const int N = 10005;
21
22 int n;
23 struct BIG_NUM {
24     int a[N+5], len;
25     BIG_NUM() {
26     }
27     BIG_NUM(int* _a, int _len) {
28         len = _len;
29         for (int i = 1; i <= _len; i++) a[i] = _a[i];
30     }
31     BIG_NUM &operator *= (const int &b) {
32         for (int i = 1; i <= len; i++) a[i] *= b;
33         for (int i = 1; i <= len; i++) a[i+1] += a[i]/10, a[i] %= 10;
34         int loc = len+1;
35         while (a[loc]) {
36             a[loc+1] += a[loc]/10; a[loc] %= 10; loc++;
37         }
38         len = loc-1;
39     }
40     BIG_NUM &operator /= (const int &b) {
41         int r = 0, i;
42         BIG_NUM ans;
43         for (i = len; i >= 1; i--) {
44             r = r*10+a[i];
45             if (r >= b) break;
46         }
47         ans.len = i;
48         for (i-- ; i >= 1; i--) {
49             ans.a[i+1] = r/b; r = r%b*10+a[i];
50         }
51         ans.a[1] = r/b;
52         len = ans.len; for (int i = 1; i <= len; i++) a[i] = ans.a[i];
53     }
54     void print() {
55         for (int i = len; i >= 1; i--) printf("%d", a[i]);
56         printf("\n");
57     }
58 }A;
59
60 void work() {
61     scanf("%d", &n);
62     A.len = A.a[1] = 1;
63     for (int i = n+2; i <= (n<<1); i++) A *= i;
64     for (int i = 2; i <= n; i++) A /= i;
65     A.print();
66 }
67 int main() {
68     work();
69     return 0;
70 }

转载于:https://www.cnblogs.com/NaVi-Awson/p/7748308.html

[AHOI 2012]树屋阶梯相关推荐

  1. P2532 [AHOI2012]树屋阶梯

    P2532 [AHOI2012]树屋阶梯 提交4.66k 通过1.79k 时间限制1.00s 内存限制125.00MB 提交答案加入题单 复制题目 题目提供者clearman 难度提高+/省选- 历史 ...

  2. [Catalan数三连]网格有趣的数列树屋阶梯

    如何让孩子爱上打表 Catalan数 Catalan数是组合数学中一个常出现在各种计数问题中的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名. 先丢个公式(设第n项为$ ...

  3. BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]

    2822: [AHOI2012]树屋阶梯 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 779  Solved: 453 [Submit][Statu ...

  4. P2532 [AHOI2012]树屋阶梯($Catalan$数高精度)

    P2532 [AHOI2012]树屋阶梯(Catalan数&高精度) 题目传送门 思路:卡特兰数的变形,可根据包含直角点的矩形覆盖的阶梯点的位置进行加法原理,然后对每个情况进行乘法原理,可以得 ...

  5. BZOJ2822 [AHOI2012]树屋阶梯

    求卡特兰数,h[i]=C(2n,n)/(n+1) 1 #include<bits/stdc++.h> 2 using namespace std; 3 int v[1005],p[1005 ...

  6. bzoj2822 [AHOI2012]树屋阶梯 dp

    容易得到一个结论:每一个块必须卡住一个角,不然一定是无法覆盖全的(一个矩形只能覆盖一个角) 所以就枚举多出来的矩形覆盖哪个角,剩下的方案数用以前算过的,类似插数dp 注:这个题竟然丧病的卡常,高精用的 ...

  7. 卡特兰数(简单说说)

    参考题解: [算法]震惊!!!史上最详细的卡特兰数浅谈!!! 卡特兰数(好像很有用的说) 介绍 卡特兰数是组合数学中一种著名数列,其前几项为: 1, 2, 5, 14, 42, 132, 429, 1 ...

  8. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  9. YBT 6 数学基础

    $补+写题ing$ 第 1 章 快速幂 序列的第 k 个数 link $solution:$ 板子 A 的 B 次方 link $solution:$ 板子 [NOIP2013] 转圈游戏 link ...

  10. [杂谈] 14. Catalan卡特兰数

    文章目录 1. 前言 2. 卡特兰数递推公式推导 3. 卡特兰数性质 4. 卡特兰数简单实例 实例1:进出栈问题 实例2:进出栈问题变种 实例三:电影购票问题 实例四:上班路径问题 实例五:乘法结合律 ...

最新文章

  1. 使用SSH上传部署WAR包到服务器
  2. mysql添加两种数据类型_MySQL入门(二) 数据库数据类型详解
  3. 【二叉树】【144. 二叉树的前序遍历】【中等】
  4. elasticsearch 根据条件去除重复值_Excel工作表中的条件格式,不只是查找重复值,还有7种典型用法...
  5. SparkSQL程序设计
  6. 使用git将本地仓库上传到远程仓库
  7. SourceTree 免注册
  8. js题集25--编程训练
  9. java 使用 lamba 表达式处理二维数组
  10. 微信刷投票软件手机版、微信免费刷票软件建立的原理解析
  11. 旭荣管理软件怎么修改小票内容_美萍超市管理软件——让管理回归轻松
  12. 车载高精度GNSS定位天线
  13. Vivado 错误代码 [DRC PDCN-2721] 解决
  14. 基于ThinkPHP6+Layui的后台管理框架
  15. python编程实例题目
  16. 计算机开机高级设置密码,给电脑设置开机密码
  17. Python——循环遍历多个列表实现字符的组合拼接
  18. Word和Excel齐发力,将多个单元格的文本内容合并到一个单元格
  19. 八皇后问题(Java代码实现)
  20. 简要分析“区块链+物联网”有哪些坎?

热门文章

  1. 生产环境中的PHP WEB 简单架构
  2. iOS中Lua脚本应用笔记一:脚本概念相关
  3. 前端图表生成利器--ECharts推荐
  4. action与jsp传值的几种方法
  5. 你必须知道:localStorage、sessionStorage 和 Cookie 区别在什么地方
  6. js获取数组中的最大值和最小值的方法汇总
  7. C++ 前向声明(转载)
  8. android 邮件发送html,如何发送HTML电子邮件
  9. 幻塔html5,《幻塔》捏脸系统怎么玩 捏脸系统玩法分享
  10. mysql所选路径已经存在_MySQL 入门知识(下) | 周末送资料