P3200 [HNOI2009]有趣的数列--洛谷luogu
---恢复内容开始---
题目描述
我们称一个长度为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的值。
输入输出格式
输入格式:
输入文件只包含用空格隔开的两个整数n和P。输入数据保证,50%的数据满足n<=1000,100%的数据满足n<=1000000且P<=1000000000。
输出格式:
仅含一个整数,表示不同的长度为2n的有趣的数列个数mod P的值。
输入输出样例
3 10
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)。 ------------------------------------------------------------------------------------------------- 做之前我知道这是一道
关于Catalan数的问题
但是
当我读完题目后
我是真的蒙了
它是怎么和Catalan数挂上关系的
于是
我再次被卑微了
————————————————————————————————————————————————————————————————————————————————————
考察这样相邻的两项:a_{2i-1}a2i−1与a_{2i}a2i,根据题目的第二条原则显然有a_{2i-1}<a_{2i}a2i−1<a2i。
而根据第一条原则又有奇数是递增的。
所以有a_1<a_3<...<a_{2i-1}<a_{2i}a1<a3<...<a2i−1<a2i。
这个时候可以联想到这道经典的题目。
我们可以将奇数项看为入栈,偶数项看为出栈。
发现和入栈次数必须大于出栈次数的条件恰好相符。
所以可以使用卡特兰数求解。
但是直接暴力用公式是会爆的
所以需要一些优化
#include <bits/stdc++.h>
using namespace std;
long long i,j,n,m,ans,sum,x,a[],b[],p[];
int main()
{
scanf("%lld%lld",&n,&m); for (i=; i<=*n; i++)
{
if (a[i]==)
{
sum++;
p[sum]=i;
a[i]=sum;
}//sum累加,p数组标记第sum个质数为i ,a[i]表示i这个数是由第sum个质数筛得的
for (j=; j<=sum; j++) //枚举当前已得到的所有质数,用这些质数筛选出在范围内的可以被这些质数筛得合数
if (p[j]*i<=*n)
a[p[j]*i]=j;
else
break;
//并把筛到的合数标记是被第几个质数 筛到的
} for (i=n+; i<=*n; i++)
{
x=i;
while (x>)
{
b[a[x]]++;
x=x/p[a[x]];
} //a[x]表示第x个数是由第a[x]个质数筛得的, 然后把表示第a[x]个质数个数的数组累加
//做完上述操作后将x除以已累加的质数
} for (i=; i<=n; i++)
{
x=i;
while (x>)
{
b[a[x]]--;
x=x/p[a[x]];
} //重复上述操作
}
ans=;
for (i=; i<=sum; i++)
for (j=; j<=b[i]; j++)
ans=ans*p[i]%m; //p[i]表示第i个质数是什么,b[i]表示有第i个质数共有几个
printf("%lld",ans);
return ;
}
P3200 [HNOI2009]有趣的数列--洛谷luogu的更多相关文章
- 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)
P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...
- 【题解】洛谷P3200 [HNOI2009] 有趣的数列(卡特兰数+质因数分解)
洛谷P3200:https://www.luogu.org/problemnew/show/P3200 思路 这题明显是卡特兰数的题型咯 一看精度有点大 如果递推卡特兰数公式要到O(n2) 可以证明得 ...
- P3200 [HNOI2009]有趣的数列
题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<...<a2n ...
- Luogu P3200 [HNOI2009]有趣的数列
题意 给定 \(n\),求有多少个长度为 \(2n\) 的排列 \(p\) 满足 对于 \(1\leq i\leq n\),\(p_{2i-1}<p_{2i}\). \(p_1<p_3&l ...
- 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)
[BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...
- BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )
打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...
- BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]
1485: [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所 ...
- BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数
BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ ...
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
随机推荐
- 定时任务Crontab
0.基本概念 & 实现原理 定时任务基本概念: 调度器:负责管理Quartz应用运行时环境,用于调度定时任务. 定时任务:按照某种时间规则,被调度的任务. a.从有无状态来说,有以下两种: ...
- CSS3效果:animate实现点点点loading动画效果(一)
实现如图所示的点点点loading效果: 一:CSS3 animation实现代码 html代码: 提交订单中<span class="ani_dot">...< ...
- MongoDB 3.0 WT引擎参考配置文件
单实例: systemLog: destination: file ###日志存储位置 path: /data/mongodb/log/mongod.log logAppend: true stora ...
- [ORACLE]ORA-28002 The password will expire within 7 days.将不能登录系统
错误“ORA-28002 The password will expire within 7 days. Cannot logon to the database“当在进程调度器上运行AE程序可能遇 ...
- Duplicate entry '0' for key 'PRIMARY'
一般使用ORM时,提交新增实体时, mysql会出现此错误:Duplicate entry '0' for key 'PRIMARY' 原因是插入语句,未提供主键的值,且主键是非自增长的. 解决办法是 ...
- SDN的初步实践--通过netconf协议控制交换机
1.近期在做一个云服务项目,需要与物理交换机配合实现,通过python编程实现了对物理交换机的控制,完全不需要命令行手工配置交换机, 一定程度上实现了SDN的集中控制的思想. 2.架构图如下: 3.利 ...
- Jump Flood Algorithms for Centroidal Voronoi Tessellation
Brief Implemented both CPU and GPU version, you could consider this as the basic playground to imple ...
- Native SBS for Android
Native SBS for Android是一款非常棒的软件,支持安卓在2D界面下左右分屏显示,并可以设置缩放比例及左右间距,横屏自动切换为左右分屏显示模式,竖屏则为正常显示.启动左右分屏模式后,将 ...
- 方向键控制圆球运动(简易)(js)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ELK的sentinl告警配置详解
背景 sentinl的监控&告警是通过watch实现的. 一.Watch Execution 执行开始的时候, watcher为watch创建watch执行上下文. 执行上下文提供脚本和模板, ...