BZOJ1485[HNOI2009] 有趣的数列

 

Description

我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件:

(1)它是从1到2n共2n个整数的一个排列{ai};

(2)所有的奇数项满足a1<a3<…<a2n-1,所有的偶数项满足a2<a4<…<a2n

(3)任意相邻的两项a2i-1与a2i(1≤i≤n)满足奇数项小于偶数项,即:a2i-1<a2i

现在的任务是:对于给定的n,请求出有多少个不同的长度为2n的有趣的数列。因为最后的答案可能很大,所以只要求输出答案 mod P的值。

Input

输入文件只包含用空格隔开的两个整数n和P。输入数据保证,50%的数据满足n≤1000,100%的数据满足n≤1000000且P≤1000000000。

Output

仅含一个整数,表示不同的长度为2n的有趣的数列个数mod P的值。

Sample Input

3 10

Sample Output

5

对应的5个有趣的数列分别为(1,2,3,4,5,6),(1,2,3,5,4,6),(1,3,2,4,5,6),(1,3,2,5,4,6),(1,4,2,5,3,6)。

题解

对于 A4 来说 它一定大于前三个

对于 A3 来说 它一定小于后五个

所以可以推断 AI <2*i

可以容易得到一个n^2的dp

f[i][j]表示前i位填到数字j的方案,即第i位用的是j

f[i][j]=f[i][j-1]+f[i-1][j-1] (j<=2*i-1)

f[i][j]=f[i][j-1] (j>2*i-1)

输出前几项,发现是个卡特兰数列  F(n)=C(2*n,n)/(n+1)

分解质因数求即可

至于为什么是卡特兰数列?其实就是从左往右扫每个数,把放在奇数项看作入栈,偶数看作出栈

50 分 dp

#include<bits/stdc++.h>
using namespace std;
int n,mod;
int f[][];
int main(){
scanf("%d%d",&n,&mod);
for(int i=;i<=*n;i++) f[][i]=;
for(int i=;i<=n;i++)
for(int j=;j<=*n;j++)
if (j<=*i-) f[i][j]=(f[i][j-]+f[i-][j-])%mod;
else f[i][j]=f[i][j-]%mod;
printf("%d\n",f[n][*n]);
return ;
}

100 分 卡特兰

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e6+;
ll pri[MAXN],mn[MAXN*],num[MAXN*],ans=;
int n,mod,cnt;
bool use[MAXN*];
void getpri(){
for (int i=;i<=*n;i++){
if (!use[i]) pri[++cnt]=i,mn[i]=cnt;
for (int j=;pri[j]*i<=*n&&j<=cnt;j++){
use[pri[j]*i]=,mn[pri[j]*i]=j;
if (i%pri[j]==) break;
}
}
}
void add(int x,int f){
while (x!=){
num[mn[x]]+=f;
x/=pri[mn[x]];
}
}
int main(){
scanf("%d%d",&n,&mod);
getpri();
for (int i=*n;i>n;i--) add(i,);
for (int i=;i<=n;i++) add(i,-);
add(n+,-);
for (int i=;i<=cnt;i++) while (num[i]--) ans=(ans*pri[i])%mod;
printf("%lld\n",ans);
return ;
}

「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)的更多相关文章

  1. 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)

    [BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...

  2. bzoj1485:[HNOI2009]有趣的数列

    思路:首先限制数很多,逐步来考虑,限制一很容易满足,考虑限制二,也就是让奇数位和偶数位上的数递增,限制三就是让奇数位上的数小于奇数位加一对应的偶数位上的数,那么我们可以把形成序列的过程看成加数的过程, ...

  3. BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数

    BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ ...

  4. [HNOI2009]有趣的数列 题解(卡特兰数)

    [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...

  5. [HNOI2009]有趣的数列 卡特兰数

    题面:[HNOI2009]有趣的数列 题解: 观察到题目其实就是要求从长为2n的序列中选n个放在集合a,剩下的放在集合b,使得集合a和集合b中可以一一对应的使a中的元素小于b. 2种想法(实质上是一样 ...

  6. bzoj1485: [HNOI2009]有趣的数列(Catalan数)

    1485: [HNOI2009]有趣的数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2105  Solved: 1117[Submit][Stat ...

  7. BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )

    打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...

  8. 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)

    P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...

  9. BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]

    1485: [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所 ...

随机推荐

  1. Linux 下安装Yaf扩展

    1.在官网下载了yaf扩展包 yaf-3.0.3.tgz 2.开始安装yaf扩展 tar zxvf yaf-3.0.3.tgz cd yaf-3.0.3 phpize ./configure --wi ...

  2. css总结10:父标签没有定义高度,盒子异常移动

    1 问题:在父标签没有定义高度的情况下,嵌套的盒子浮动后,父标签下面的元素发生位置错误. 2 解决方法: 2.1(大厂网页常用方法) 添加额外元素: 即:父标签下添加一个元素(.clearfix),去 ...

  3. Regularization and model selection

    Suppose we are trying select among several different models for a learning problem.For instance, we ...

  4. BZOJ 3083 遥远的国度(树链剖分+LCA)

    Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要z ...

  5. POJ3259 Wormholes(SPFA判断负环)

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  6. 小议C#接口的隐式与显示实现

    小弟不才,各位大牛嘴下留情... 一.对于继承类里头有相同方法时候,用接口方式去调用,会优先查走显式接口方法 例如 public interface IA { void Test(); } publi ...

  7. docker--基本命令

    仅做学习参考,可能有误 part1:启动docker服务 在Windows上使用MySQL时候,有时无法直接使用MySQL -uroot -p 来进入MySQL,这是因为我们没有启动会MySQL服务此 ...

  8. Bitnami WordPress无法修改MySQL root的默认密码的解决方法?

    今天准备修改Bitnami WordPress的MySQL root的默认密码,但是总是出现下面错误: ERROR 1045 (28000): Access denied for user 'root ...

  9. Eclipse下的Hadoop应用开发准备

    window下开发的准备: A.在windows的某个目录下解压一个hadoop的安装包 B.将安装包下的lib和bin目录用对应windows版本平台编译的本地库替换 C.在window系统中配置H ...

  10. NSRect 位置和尺寸

    前言 结构体 这个结构体用来表示事物的坐标点和宽高度. typedef CGRect NSRect; struct CGRect { CGPoint origin; CGSize size; }; t ...