「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)
「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] 有趣的数列 (卡特兰数列)的更多相关文章
- 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)
[BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...
- bzoj1485:[HNOI2009]有趣的数列
思路:首先限制数很多,逐步来考虑,限制一很容易满足,考虑限制二,也就是让奇数位和偶数位上的数递增,限制三就是让奇数位上的数小于奇数位加一对应的偶数位上的数,那么我们可以把形成序列的过程看成加数的过程, ...
- BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数
BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ ...
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
- [HNOI2009]有趣的数列 卡特兰数
题面:[HNOI2009]有趣的数列 题解: 观察到题目其实就是要求从长为2n的序列中选n个放在集合a,剩下的放在集合b,使得集合a和集合b中可以一一对应的使a中的元素小于b. 2种想法(实质上是一样 ...
- bzoj1485: [HNOI2009]有趣的数列(Catalan数)
1485: [HNOI2009]有趣的数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2105 Solved: 1117[Submit][Stat ...
- BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )
打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...
- 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)
P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...
- BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]
1485: [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所 ...
随机推荐
- ibatis和hibernate
ibatis:sql需要自己写hibernate:sql自动生成上面是最大的区别,下面是一些细节.选择Hibernate还是iBATIS都有它的道理:Hibernate的特点:Hibernate功能强 ...
- 01 git 概念
本文转自“廖雪峰的git教程” 集中式版本控制系统:版本库是集中存放在中央服务器的,中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆. 分布式版 ...
- 下载特定区域内街景照片数据 | Download Street View Photos within Selected Region
作者:姜虹,刘子煜,王玥瑶,杨安琪,天靖居士 街景图片可以通过api下载,但需要提供参数,参数中的poiid.panoid.location可以用来确定位置或全景图片的ID以确定对应的街景图片.优先级 ...
- MyEclipse2014配置2.5版本的struts2
原创 配置struts2一般来说需要以下步骤: 将项目所需要的Jar包导入项目webRoot/WEB-INF/lib下(包不追求多,容易导致冲突或者其他问题,需要多少导入多少) 配置struts.xm ...
- 游戏中遇到的BUG
(1)bug描述:战斗中有英雄死亡,一方掉线之后再次上线,仍然可以看到死亡英雄空血条(英雄受到攻击才会显示血条) 解决方案:原来 当前血量小于英雄血量最大值时,证明英雄受到伤害,血条显示为true I ...
- CPU 和 GPU 的区别
作者:知乎用户链接:https://www.zhihu.com/question/19903344/answer/96081382来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Selenium API(一)
1.设置浏览器大小: # -*- coding:utf- -*- from selenium import webdriver import time driver = webdriver.Firef ...
- PHP编码技巧
原则 正确实现功能 执行速度与快 占系统资源少 后期维护方便 编程注意 1.命名很重要 2.适当的使用注释 3.使用一个变量,需要初始化 4.优先使用单引号 $row['id']的效率是$row[id ...
- 2. C/C++笔试面试经典题目二
1. C和C++中struct有什么区别? [参考答案] [解析]C中的struct没有保护行为,没有public,private,protected,内部不能有函数,但可以有函数指针. 2. C++ ...
- Python3异常处理
一. 简介 在编程过程中为了增加友好性,在程序出现Bug时一般不会直接将错误信息展示给用户,而是提供一个友好的输出提示. 二. 使用 1. 异常基础 常用结构: try: pass except Ex ...