题目:P2532 [AHOI2012]树屋阶梯

思路:

打表之后不难看出是裸的Catalan数。简单证明一下:

对于任意一种合法方案,都可以表示为在左下角先放一个\(k*(n+1-k),k\in[1,n]\)的矩形,再在矩形的上边和右边分别放\(k-1\)阶台阶和\(n-k\)阶台阶。

例如下图(从luogu题解中盗的图...):

在左下角先放了一个\(2*3\)的矩形,之后在矩形上边放\(1\)阶台阶,在矩形右边放\(2\)阶台阶。



不难看出矩形上边和右边两部分独立,只要枚举左下矩阵长度,对每种矩形,把上边和右边的方案数相乘(乘法原理),再把不同矩形长度得到的答案相加(加法原理)就能得到总方案数。

设\(h(n)\)为n阶台阶方案数,得到递推式\(h(n)=\sum_{k=1}^nh(k-1)*h(n-k)\),就是Catalan数。

计算时分解质因数即可。


Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 5000,base=10000,power=4;
int n,tot,p[N],mindiv[N],cnt[N];
struct bigint{
int len,d[N];
inline bigint (){
memset(d,0,sizeof(d));
len=1;
}
inline bigint(int num){
len=1;
d[1]=num;
}
void clean(){
while(len>1&&!d[len]) --len;
}
inline bigint operator * (const bigint &b)const{
bigint c;
c.len=len+b.len;
for(int i=1;i<=len;++i) for(int j=1;j<=b.len;++j)
c.d[i+j-1]+=d[i]*b.d[j],c.d[i+j]+=c.d[i+j-1]/base,c.d[i+j-1]%=base;
c.clean();
return c;
}
inline void print(){
clean();
printf("%d",d[len]);
for(int i=len-1;i;--i) printf("%0*d",power,d[i]);
}
};
void Prime(){
for(int i=2;i<=2*n;++i){
if(!mindiv[i]) mindiv[i]=p[++tot]=i;
for(int j=1;j<=tot;++j){
if(i*p[j]>2*n||p[j]>mindiv[i]) break;
mindiv[i*p[j]]=p[j];
}
}
}
void add(int num){
while(num^1){
++cnt[mindiv[num]];
num/=mindiv[num];
}
}
void del(int num){
while(num^1){
--cnt[mindiv[num]];
num/=mindiv[num];
}
}
bigint quickpow(int a,int b){
bigint res=1,c=a;
while(b){
if(b&1) res=res*c;
c=c*c;
b>>=1;
}
return res;
}
bigint Catalan(int n){
for(int i=n+2;i<=2*n;++i) add(i);
for(int i=1;i<=n;++i) del(i);
bigint res=1;
for(int i=1;i<=tot;++i) res=res*quickpow(p[i],cnt[p[i]]);
return res;
}
int main(){
scanf("%d",&n);
Prime();
Catalan(n).print();
return 0;
}

P2532 [AHOI2012]树屋阶梯的更多相关文章

  1. 洛谷P2532 [AHOI2012]树屋阶梯(Catalan数)

    P2532 [AHOI2012]树屋阶梯 题目描述 输入输出格式 输入格式: 一个正整数N(1<=N<=500),表示阶梯的高度. 输出格式: 一个正整数,表示搭建方法的个数.(注:搭建方 ...

  2. P2532 [AHOI2012]树屋阶梯 卡特兰数

    这个题是一个卡特兰数的裸题,为什么呢?因为可以通过划分来导出递推式从而判断是卡特兰数,然后直接上公式就行了.卡特兰数的公式见链接. https://www.luogu.org/problemnew/s ...

  3. 【题解】洛谷P2532 [AHOI2012]树屋阶梯(卡特兰数+高精)

    洛谷P2532:https://www.luogu.org/problemnew/show/P2532 思路 来自Sooke大佬的推导: https://www.luogu.org/blog/Sook ...

  4. Luogu P2532 [AHOI2012]树屋阶梯 卡特兰数

    接着压位OvO... 我不会告诉你答案就是卡特兰数... 为什么呢? 首先,$ans[0]=1,ans[1]=1,ans[2]=2$ 对于$ans[3]$,我们可以发现他是这样来的: $ans[3]= ...

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

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

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

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

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

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

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

    2822: [AHOI2012]树屋阶梯 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 879  Solved: 513[Submit][Status] ...

  9. 题解 P2532 【[AHOI2012]树屋阶梯】

    本题运用卡特兰数求解. 卡特兰数有两种表达方式: 1)\(h_i=\sum^{k=0}_{i-1}h_kh_{i-k-1}\) 2)\(h_i=\frac{1}{n+1}C^{n}_{2n}\) 运用 ...

随机推荐

  1. ES6学习笔记之解构赋值

    1.数组的解构赋值 简单用法 { // 旧 let a=1,b=3; //新 let [a,b]=[1,3]; console.log(a,b);// 1 3 } 只要等号两边的模式相同,左边的变量就 ...

  2. 关于CE的反思

    当你注视着你的分数, 眼眶倏地猛睁. 不会做的题血红一片, 认真做了的题一点墨蓝. 你知道, 你CE了, 你挂了, 你倒数第一了, 你当场去世了. 两小时的努力付诸东流, 线段树的碎片历历在目. 思考 ...

  3. 标记扩展和 WPF XAML

      本主题介绍 XAML 的标记扩展概念,包括其语法规则.用途以及底层的类对象模型. 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能. 本主题专门详细论述了用于 WPF X ...

  4. 转载 WPF -- 控件模板 (ControlTemplate)(一) https://blog.csdn.net/qq_23018459/article/details/79899838

    ControlTemplate(控件模板)   https://blog.csdn.net/qq_23018459/article/details/79899838 WPF包含数据模板和控件模板,其中 ...

  5. fastjson 对象和json互转

    list转json List<Openid> openids = od.getAll(session); String json = JSONObject.toJSONString(ope ...

  6. request.setCharacterEncoding("utf-8");

    request.setCharacterEncoding("utf-8");不加这句话时,从input控件得到值要用new String(request.getParameter( ...

  7. 1.1Jupyter notbook 的使用

    目录 目录 (一)安装Jupyter notebook 1.在控制台输入: 2.注意: 3.安装的过程: (二)启动Jupyter notebook (三)文件管理 (四)基本概念与操作 1.什么是C ...

  8. 集训队日常训练20180525-DIV2

    A.2295 求有多少素数对和等于n. 暴力. #include <bits/stdc++.h> using namespace std; int ss(int n) { ,a=sqrt( ...

  9. NKOJ3485 【2015多校联训4】数据

    问题描述 Mr_H 出了一道信息学竞赛题,就是给 n 个数排序.输入格式是这样的:试题有若干组数据.每组数据的第一个是一个整数 n,表示总共有 n 个数待排序:接下来 n 个整数,分别表示这n 个待排 ...

  10. Jquery选择器分类:基本选择器,层次选择器,过滤选择器,表单选择器。

    基本选择器 说明:通过元素id.class和标签名等来查找DOM元素 1.id选择器:$("#test");//选取id为test的元素 2.类选择器:$(".test& ...