「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[1005][2005];
int main(){scanf("%d%d",&n,&mod);for(int i=0;i<=2*n;i++) f[0][i]=1;for(int i=1;i<=n;i++)for(int j=1;j<=2*n;j++)if (j<=2*i-1) f[i][j]=(f[i][j-1]+f[i-1][j-1])%mod;else f[i][j]=f[i][j-1]%mod;printf("%d\n",f[n][2*n]);return 0;
}

 

 100 分 卡特兰

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

 

转载于:https://www.cnblogs.com/shjrd-dlb/p/9048894.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wedo2.0编程模块介绍_能量黑科技模块系列十:RFID魔块

RFID魔块RFID此模块可以对套件配套的RFID卡或者空白RFID卡进行读写&#xff0c;用于权限验证的DIY制作。常规的公交卡、地铁卡是无法进行写入&#xff0c;但可以读取UID号。配套RFID卡内存为1K&#xff0c;有16个分区&#xff0c;每个分区有3个数据块可进行写入此模块可以对套件…

[SoapUI] 通过SoapUI发送POST请求,请求的body是JSON格式的数据

通过SoapUI发送POST请求&#xff0c;请求的body是JSON格式的数据&#xff1a; data{"currentDate":"2015-06-19","reset":true} 而且通过Fiddler抓取页面报文 Content-Type 是 application/x-www-form-urlencoded 一开始我将Content-Type appl…

oracle -239报错,解决: ./check_oracle_health --connect orcl --mode connection-time 报错的问题...

错误提示./check_oracle_health --connect orcl --mode connection-timeCRITICAL - cannot connect to orcl. install_driver(Oracle) failed: Cant locate DBD/Oracle.pm in INC (INC contains: . /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_per…

el-button 图标显示在字后边_Excel和Visio联姻,自动生成跨职能流程图,还能用图标标记状态,太牛了!...

正文共&#xff1a;1332 字 21 图预计阅读时间&#xff1a; 4 分钟Visio是Office软件系列中的负责绘制流程图和示意图的软件&#xff0c;创建具有专业外观的Visio图表&#xff0c;以便用户更好地理解和分析。企业管理中&#xff0c;业务流程在不同部门间流转&#xff0c;涉及提…

【SpringBoot笔记】SpringBoot整合Druid数据连接池

废话少说&#xff0c;按SpringBoot的老套路来。 【step1】&#xff1a;添加依赖 <!-- 数据库连接池 --> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.25</version> </depende…

struts2中非表单标签的使用 componen

2. component标签 component标签用于使用自己的自定义组件&#xff0c;这是一个非常灵活的用法&#xff0c;如果经常需要使用某个效果片段&#xff0c;就可以考虑将这个效果片段定义成一个自定义组件&#xff0c;然后在页面中使用component标签来使用该自定义组件。因为使…

oracle 11g r2 rac中节点时间不同步,Oracle11gR2安装RAC错误之--时钟不同步

系统环境&#xff1a; 操作系统&#xff1a;RedHat EL5 Cluster&#xff1a; Oracle GI(Grid Infrastructure) Oracle&#xff1a; Oracle 11.2.0.1.0 如图所示&#xff1a;RAC 系统架系统环境&#xff1a;操作系统&#xff1a;RedHat EL5Cluster&#xff1a; Oracle GI(Grid I…

酒店预定系统

系统功能模块功能图 用例图 E-R图 转载于:https://www.cnblogs.com/qlly-20/p/9052461.html

74-A/D指标,Accumulation/Distribution,积累/派发线,离散指标.(2015.7.1)

A/D指标&#xff0c;Accumulation/Distribution积累/派发线&#xff0c;离散指标观井映天2015.7.1转载于:https://www.cnblogs.com/i201102053/p/10626638.html

linux 密码修改下次,问题:如何强制用户在下次登录Linux时更改密码

当你使用默认密码创建用户时&#xff0c;你必须强制用户在下一次登录时更改密码。当你在一个组织中工作时&#xff0c;此选项是强制性的。因为老员工可能知道默认密码&#xff0c;他们可能会也可能不会尝试不当行为,看到下图会不会有为用户担心的感觉&#xff1a;使用 passwd 命…

svn的merge使用例子

先说说什么是branch。按照Subversion的说法&#xff0c;一个branch是某个development line&#xff08;通常是主线也即trunk&#xff09;的一个拷贝&#xff0c;见下图&#xff1a; branch存在的意义在于&#xff0c;在不干扰trunk的情况下&#xff0c;和trunk并行开发&#xf…

plot画分段函数_python画图函数大全

很多时候&#xff0c;我们需要用python画图&#xff0c;这样就可以更加直观的看到数据的走势&#xff0c;而不是干巴巴的数字。今天&#xff0c;我们就给大家整理了一下python画图的常用函数&#xff0c;由于篇幅限制。无法将这些函数的使用方法全部表现出来。所以&#xff0c;…

第9章 使用ssh服务管理远程主机。

章节简述&#xff1a; 学习使用nmtui命令配置网卡参数、手工将多块网卡做绑定、使用nmcli命令查看网卡信息和使用ss命令查看网络及端口状态。 完整演示sshd服务配置方法并详细讲述每个参数的作用&#xff0c;实战基于密钥远程登陆实验以及用screen服务让远程会话不再终断。 本…

enum不能被继承

1、枚举类介绍 如果一个类的实例是有限且确定的&#xff0c;那么可以使用枚举类。比如&#xff1a;季节类&#xff0c;只有春夏秋冬四个实例。 枚举类使用enum进行创建&#xff0c;其实例必须从”第一行“开始显示写出。 enum Season{SPRING,SUMMER,FALL,WINTER;//默认public s…

linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由

问题/发现&#xff1a;本人在为一款路由器写一个统计局域网互传流量的Linux内核模块的时候&#xff0c;发现如下问题&#xff1a;局域网内的一台设备和该局域网内另一台设备进行通信时&#xff0c;我在路由器的netfilter链表处设下钩子&#xff0c;以捕获数据。后来发现这些数据…

kali linux 升级命令_作为高级Java,你应该了解的Linux知识

原创&#xff1a;小姐姐味道(微信公众号ID&#xff1a;xjjdog)&#xff0c;欢迎分享&#xff0c;转载请保留出处。作为一个javaer&#xff0c;我以前写过很多关于Linux的文章。但经过多年的观察&#xff0c;发现其实对于大部分人&#xff0c;有些东西压根就用不着。用的最多的&…

linux centos 光盘修复,CentOS7删除/boot/initramfsxxx.img并尝试光盘救援模式修复

CentOS7删除/boot/initramfsxxx.img并尝试光盘救援模式修复一、删除/boot/initramfs-3.10.0-957.el7.x86_64.img[rootswitch ~]# rm -f /boot/initramfs-3.10.0-957.el7.x86_64.img二、重启起不来三、插入光盘&#xff0c;进入修复模式(VMWare开机按esc)四、选择修复CentOS7系统…

I/O多路转接之poll,epoll

1、poll函数原型&#xff1a;#include <poll.h>int poll(struct pollfd fds[], nfds_t nfds, int timeout)&#xff1b;参数说明:fds&#xff1a;是一个struct pollfd结构类型的数组&#xff0c;用于存放需要检测其状态的Socket描述符&#xff1b;每当调用这个函数之后&a…

pn532写入手机nfc_NFC手机手环脱机模拟加密门禁卡,你get了吗?

目标&#xff1a;将门禁卡、考勤卡、会员卡、停车卡、电梯卡等等各种卡模拟进手机里&#xff0c;模拟后可用手机代替刷卡&#xff0c;无需root&#xff0c;不用电脑背景介绍&#xff1a;前言目前&#xff0c;IC卡已被广泛应用于身份识别、金融消费、安全认证等领域。大多数人每…