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
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)。
Solution
卡特兰数。每次找最前面的奇数/偶数位置放,显然若偶数位不多于奇数位就是合法的,然后就成了卡特兰数。
我才不会说我一开始是先直接猜了个卡特兰数交上去的
Code
#include<iostream>
#include<cstdio>
#define N (2000009)
#define LL long long
using namespace std; LL n,MOD,cnt,ans=,prime[N],Keg[N],d[N]; void Euler()
{
for (int i=; i<=*n; ++i)
{
if (!d[i]){d[i]=i; prime[++cnt]=i;}
for (int j=; j<=cnt && i*prime[j]<=*n; ++j)
{
d[i*prime[j]]=prime[j];
if (i%prime[j]==) break;
}
}
} void Divide(LL x,int opt)
{
while (x!=) Keg[d[x]]+=opt,x/=d[x];
} int main()
{
scanf("%lld%lld",&n,&MOD);
Euler();
for (int i=n+; i<=*n; ++i) Divide(i,);
for (int i=; i<=n; ++i) Divide(i,-);
Divide(n+,-);
for (int i=; i<=*n; ++i)
for (int j=; j<=Keg[i]; ++j)
ans=ans*i%MOD;
printf("%lld\n",ans);
}
BZOJ1485:[HNOI2009]有趣的数列(卡特兰数)的更多相关文章
- BZOJ1485: [HNOI2009]有趣的数列(卡特兰数+快速幂)
题目链接 传送门 题面 思路 打表可以发现前六项分别为1,2,5,12,42,132,加上\(n=0\)时的1构成了卡特兰数的前几项. 看别人的题解说把每一个数扫一遍,奇数项当成入栈,偶数项当成出栈, ...
- [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 ...
- [HNOI2009] 有趣的数列——卡特兰数与杨表
[HNOI 2009] 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…&l ...
- bzoj 1485 [HNOI2009]有趣的数列 卡特兰数
把排好序的序列看成一对对括号,要把他们往原数列里塞,所以就是括号序合法方案数 即为卡特兰数 f(n)=Cn2nn+1 求的时候为避免除法,可以O(n)计算每个素数出现次数,最后乘起来,打完之后发现其实 ...
- 【BZOJ 1485】[HNOI2009]有趣的数列 卡特兰数
这个题我是冲着卡特兰数来的所以就没有想到什么dp,当然也没有想到用卡特兰数的原因........... 你只要求出前几项就会发现是个卡特兰数,为什么呢:我们选择地时候要选择奇数位和偶数位,相邻(一对里 ...
- BZOJ1485: [HNOI2009]有趣的数列(Catalan数,质因数分解求组合数)
题意 挺简洁的. 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…<a ...
- luogu 3200 [HNOI2009]有趣的数列 卡特兰数+质因数分解
打个表发现我们要求的就是卡特兰数的第 n 项,即 $\frac{C_{2n}^{n}}{n+1}$. 对组合数的阶乘展开,然后暴力分解质因子并开桶统计一下即可. code: #include < ...
- BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )
打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...
随机推荐
- HTTP2 概述
HTTP/2,也就是超文本传输协议第2版,不论是1还是2,HTTP的基本语义是不变的,比如方法语义(GET/PUST/PUT/DELETE),状态码(200/404/500等),Range Reque ...
- 记录一次使用terminal进行git管理与提交到Github的过程
1.环境的构建: 使用Mac系统自带的Git进行版本管理存在,Git是系统的Xcode集成的 查看版本的命令: $ git --version git version (Apple Git-) 查看g ...
- javascript判断浏览器支持CSS3属性
function getsupportedprop(proparray){ var root=document.documentElement; //reference root element of ...
- kindeditor之video插件开发
KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果.不仅结构小巧,而且功能强大,最主要的是它采用插件的开发管理方式,能很容易再它的基础上添加插件来实现自 ...
- laravel开发之-composer安装(windows)
1 在https://getcomposer.org/download/中下载composer.exe 2 选择php.exe安装composer 3 cmd命令框中输入composer.查看是否安装 ...
- easyui树形菜单实现
需求:读取路径配置中的相对路径获取对应的子文件夹及其子文件并形成树形结构,加载xml文件,输入搜索关键字匹配xml里面的value节点的值对应的contact值的集合并进行搜索 例如:输入b,找到xm ...
- sql-(Cross||Outer)Apply
Apply - 涉及以下两个步骤中的一步或两步(取决于Apply的类型): 1.A1:把右表表达式应用于左表的行 2.A2:添加外部行 Apply运算符把右表表达式应用于左输入的每一行.右表达式可以引 ...
- The pit of an if statement in Java
package the.pit.of.an.ifstatement.injava; public class ThePitOfAnIfStatementInJava { public static v ...
- .net core Web应用启动类
在ASP.NET Core中,Startup类为Web应用的入口类,用于配置Web服务的管道/过滤器以及Web应用所能用到的服务.在启动Web应用后,ASP.NET将在主库中查询名为Startup的类 ...
- RoCE、softRoCE与iWRAP
RoCE - RDMA over Converged Ethernet 以太网在全球互联的广域网中毫无异议的老大,但在高带宽.低延时的专有网络领域却明显混不开.伴随网络融合概念兴起,IETF发布了DC ...