bzoj 2822 [AHOI2012]树屋阶梯 卡特兰数

2023-10-04 02:59

本文主要是介绍bzoj 2822 [AHOI2012]树屋阶梯 卡特兰数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为规定n层的阶梯只能用n块木板
那么就需要考虑,多出来的一块木板往哪里放
考虑往直角处放置新的木板
不管怎样,只有多的木板一直扩展到斜边表面,才会是合法的新状态,发现,这样之后,整个n层阶梯就被分成了i层和n-1-i层的阶梯,即

f(n)=i=0n1f(i)×f(n1i)

就是卡特兰数!!!,需要高精。。差评。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 1050
using namespace std;
int n,prime[N],tot,id[N],num[N];
bool bo[N];
struct bignum{int len,a[500];bignum(){len=0;memset(a,0,sizeof a);}bignum operator = (int x){while(x){a[++len]=x%10;x/=10;}return *this;}bignum operator * (int x){bignum b; b.len=len;for(int i=1;i<=len;i++){b.a[i]+=a[i]*x;b.a[i+1]+=b.a[i]/10;b.a[i]%=10;}while(b.a[b.len+1]){b.len++;b.a[b.len+1]=b.a[b.len]/10;b.a[b.len]%=10;}return b;}
}ans;
void print(bignum b){for(int i=b.len;i;i--){printf("%d",b.a[i]);}printf("\n");
}
void getprime(){for(int i=2;i<=2*n;i++){if(!bo[i]){prime[++tot]=i;id[i]=tot;}for(int j=1;j<=tot&&i*prime[j]<=2*n;j++){bo[i*prime[j]]=1; id[i*prime[j]]=j;if(i%prime[j]==0)break;}}
}
void add(int x,int y){while(x!=1){num[id[x]]+=y;x/=prime[id[x]];}
}
int main(){scanf("%d",&n);getprime();for(int i=n+2;i<=2*n;i++)add(i,1);for(int i=1;i<=n;i++)add(i,-1);ans=1;for(int i=1;i<=tot;i++)while(num[i]--) ans=ans*prime[i];print(ans);return 0;
}

这篇关于bzoj 2822 [AHOI2012]树屋阶梯 卡特兰数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1158

相关文章

hdu4828(卡特兰数+逆元)

这题的前几个数据分别为1,2,5,14,32......................然后确定这是个卡特兰数列 下面来介绍下卡特兰数,它的递推式为f[i+1] = f[i]*(4*n - 6)/n,其中f[2] = f[3] =1;f[4] = 2;f[5] = 14;f[6] = 32.................................. 但是这题的n太大了,所以要用到逆元,

hdu3389(阶梯博弈变形)

题意:有n个盒子,编号1----n,每个盒子内有一些小球(可以为空),选择一个盒子A,将A中的若干个球移到B中,满足条件B  < A;(A+B)%2=1;(A+B)%3=0 这是阶梯博弈的变形。 先介绍下阶梯博弈: 在一个阶梯有若干层,每层上放着一些小球,两名选手轮流选择一层上的若干(不能为0)小球从上往下移动,最后一次移动的胜出(最终状态小球都在地面上) 如上图所示,小球数目依次为

项目二----项目的开始是人生的阶梯【哈哈】

最近由于太忙,好久都没有编写博客了,现在又接手了第二个项目,该项目是一个订单系统,主要的功能就是用于展示保单的状态和相关的保单信息以及可以进行继续投保,最重要的是还嵌套这续保功能,这项目在去年年底时已经上线运行了,由于最近续保功能还在优化和重新开发,后续会不断的对博客进行补充。 这是一个属于中间件的项目,在软件架构和设计中主要充当【表现层和逻辑层的部分】,持久层另外项目

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

HDU 1130(卡特兰数,大数)

题意:如题。   import java.util.*;import java.math.*;public class Main{public static void main(String[] args) {int n;Scanner in=new Scanner(System.in);BigInteger one=BigInteger.ONE;BigInteger four

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in