BZOJ 2822 AHOI 2012 树屋阶梯 卡特兰数+高精度

题目大意:高精度卡特兰数。

思路:上维基上看看,有一个模型和这个题一模一样,然后就剩下水水的高精度了。

(谁来教教我java...

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define BASE 10000
#define MAX 100010
using namespace std;

struct BigInt{
    int num[MAX],len;

    BigInt(int _ = 0) {
        num[len = 1] = _;
    }
    BigInt operator +(const BigInt &a)const {
        BigInt re;
        re.len = max(len,a.len);
        int temp = 0;
        for(int i = 1; i <= a.len; ++i) {
            re.num[i] = temp + num[i] + a.num[i];
            temp = re.num[i] / BASE;
            re.num[i] %= BASE;
        }
        if(temp)    re.num[++re.len] = temp;
        return re;
    }
    BigInt operator *(int a)const {
        BigInt re;
        re.len = len;
        int temp = 0;
        for(int i = 1; i <= len; ++i) {
            re.num[i] = temp + num[i] * a;
            temp = re.num[i] / BASE;
            re.num[i] %= BASE;
        }
        while(temp) re.num[++re.len] = temp % BASE,temp /= BASE;
        return re;
    }
    BigInt operator /(int a)const {
        BigInt re;
        re.len = len;
        int temp = 0;
        for(int i = len; i; --i) {
            re.num[i] = (temp + num[i]) / a;
            temp = (temp + num[i]) % a * BASE;
        }
        while(!re.num[re.len])  --re.len;
        return re;
    }
};

int main()
{
    int x;
    cin >> x;
    BigInt ans(1);
    for(int i = 2; i <= x; ++i)
        ans = ans * (4 * i - 2) / (i + 1);
    printf("%d",ans.num[ans.len]);
    for(int i = ans.len - 1; i; --i)
        printf("%04d",ans.num[i]);
    return 0;
}
时间: 2024-10-09 03:13:22

BZOJ 2822 AHOI 2012 树屋阶梯 卡特兰数+高精度的相关文章

【BZOJ 2822】[AHOI2012]树屋阶梯 卡特兰数+高精

这道题随便弄几个数就发现是卡特兰数然而为什么是呢? 我们发现我们在增加一列时,如果这一个东西(那一列)他就一格,那么就是上一次的方案数,并没有任何改变,他占满了也是,然后他要是占两格呢,就是把原来的切成了n-2,和1,要是就剩一格呢,也是把原来的切成一格和n-2,因为如果一行的某一列被堵了那么这一行的开头的那个台阶表面就覆盖不到那一列..... 这个是从数学角度,由于递推公式的相似性所以是卡特兰数....... #include <cstdio> const int STD=10000; st

BZOJ 2822 AHOI2012 树屋阶梯 卡特兰数

题目大意:求n个矩形搭出n级阶梯的方案数 那个什么空心不能向上完全是逗你的- - 卡特兰数的应用之一- - Wiki上有说- - 具体证明不会- - 总之Python大法好- - n=int(raw_input()) temp=1 for i in range (1,n+1): temp=temp*(4*i-2)/(i+1) print temp

bzoj2822[AHOI2012]树屋阶梯(卡特兰数)

2822: [AHOI2012]树屋阶梯 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 879  Solved: 513[Submit][Status][Discuss] Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为N+1尺(N为正整数)的大树上,正当他发愁怎么爬上去的时候,发现旁边堆满了一些空

【BZOJ2822】【AHOI2012】树屋阶梯 卡特兰数 python高精度

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43404565"); } 题解: 首先考虑在当前情况下多加一层,那么我们可以枚举最后一层台阶长度来得到答案. 最后得到的是卡特兰数. 代码: f=[0]*60 f[1]=1 n=int(raw_input()) for i in range(2,n+1

卡特兰数高精度算法

很多组合题都会用到卡特兰数,增长速度又很快,应该写个高精度尊敬一下~ 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define ML 549 5 using namespace std; 6 int kt[105][550]; 7 int len[105]; 8 int getlen(int ord) 9 { 10 int pos; 11 for(int i=ML;i>=0;i

hdu 1023 卡特兰数+高精度

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasi

BZOJ 2823 AHOI 2012 信号塔 凸包+最小圆覆盖

题目大意:给出平面上n个点,求最小圆覆盖. 思路:圆覆盖问题只与所有点中凸包上的点有关,因此先求一下凸包,然后数据范围骤减.大概是只剩下logn左右个点.这样就可以随便浪了. 先找所有三个点组成的圆,然后找两个点为直径所组成的圆. 还有就是三角形的外心公式,简直不是人推的,然后我就机制的百度了,结果如下: 不要模拟退火... 样例很坑,当你算出2.49 2.86的时候,不要认为你被卡精了,其实是你写挂了... CODE: #include <cmath> #include <cstdio

2822. [AHOI2012]树屋阶梯【卡特兰数】

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

[AHOI2012]树屋阶梯 题解(卡特兰数)

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