[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的值。

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

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

Solution

1.观察下列几种简单情况:

(1)n=1:(1,2);

(2)n=2:(1,2,3,4),(1,3,2,4);

(3)n=3:(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);

可以发现每组中1一定在第一个位置,2n一定在最后一个位置,由数列的性质可以证明;

每组数列都可:增加方案数为n-1;移动上一次2n的位置,增加方案数为1;在此基础上添加2n-1,可以发现2n-1允许插入的范围为n+1,n+2,...,2n-1,由乘法原理知,总方案数为C(2n,n)/n+1;

2.所以本题化简为求解模p剩余系下的卡特兰数,那么通过卡特兰数通项公式化简知c[n]=2n(2n-1).....*(n+2)/n!,易证分子是可以整除分母的,那么统计约分后各个因子个数即可;

3.用线性筛法求出1~2n的mindiv,将分母分子分解质因数;

4.计算各质因数的幂再取模相乘即可;

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int up[200000002],mindiv[20000002],prime[20000002];
long long i,j,k,n,m,p,ans=1; void oler(long long n){ //线性筛出最小因子和素数表
for(i=2;i<=n;++i){
if(!mindiv[i]) prime[++prime[0]]=mindiv[i]=i;
for(j=1;j<=prime[0]&&prime[j]<=mindiv[i]&&(k=prime[j]*i)<=n;j++) mindiv[k]=prime[j];
}
return;
} void count(){ //统计因子
for(i=2*n;i>=n+2;--i){
k=i;
while(k>1){
up[mindiv[k]]++;
k/=mindiv[k];
}
} for(i=2;i<=n;++i){
k=i;
while(k>1){
up[mindiv[k]]--;
k/=mindiv[k];
}
}
return;
} long long qp(long long x,long long y){ //快速幂
long long a=1;
do
{
if(y%2==1)a=a*x%p;
x=x*x%p;
}
while(y/=2);
return a;
} int main(){
memset(up,0,sizeof(up));
memset(mindiv,0,sizeof(mindiv));
memset(prime,0,sizeof(prime));
scanf("%ld%ld",&n,&p);
oler(n*2);
count();
for(i=2;i<=2*n;++i) ans=(ans*qp(i,up[i]))%p;
printf("%ld\n",ans);
return 0;
}

特别感谢zzh对本题求解的帮助

卡特兰数基础知识部分可以参考我的题解:http://www.cnblogs.com/COLIN-LIGHTNING/p/8450053.html

[HNOI2009]有趣的数列 题解(卡特兰数)的更多相关文章

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

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

  2. 【题解】洛谷P3200 [HNOI2009] 有趣的数列(卡特兰数+质因数分解)

    洛谷P3200:https://www.luogu.org/problemnew/show/P3200 思路 这题明显是卡特兰数的题型咯 一看精度有点大 如果递推卡特兰数公式要到O(n2) 可以证明得 ...

  3. [bzoj1485][HNOI2009]有趣的数列_卡特兰数_组合数

    有趣的数列 bzoj-1485 HNOI-2009 题目大意:求所有1~2n的排列满足奇数项递增,偶数项递增.相邻奇数项大于偶数项的序列个数%P. 注释:$1\le n\le 10^6$,$1\le ...

  4. [luogu1485 HNOI2009] 有趣的数列 (组合数学 卡特兰数)

    传送门 Solution 卡特兰数 排队问题的简单变化 答案为\(C_{2n}^n \pmod p\) 由于没有逆元,只好用分解质因数,易证可以整除 Code //By Menteur_Hxy #in ...

  5. 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)

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

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

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

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

    一眼卡特兰数...写完才发现不对劲,样例怎么输出$0$...原来模数不一定是质数= =... 第一次见到模数不是质数的求组合数方法$(n,m\leq 10^7)$,记录一下... 先对于$1$~$n$ ...

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

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

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

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

随机推荐

  1. QQueue与QStack使用

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QQueue与QStack使用     本文地址:http://techieliang.com ...

  2. 【Leetcode】72 Edit Distance

    72. Edit Distance Given two words word1 and word2, find the minimum number of steps required to conv ...

  3. Centos7更改默认启动桌面(或命令行)模式

    centos7以后是这样的,7以前就是别的版本了 1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改 ...

  4. 如何更好的使用JAVA线程池

    这篇文章结合Doug Lea大神在JDK1.5提供的JCU包,分别从线程池大小参数的设置.工作线程的创建.空闲线程的回收.阻塞队列的使用.任务拒绝策略.线程池Hook等方面来了解线程池的使用,其中涉及 ...

  5. Struts创建流程

    1.启动服务,加载web.xml 并实例化StrutsPrepareAndExecuteFilter过滤器 2.在实例化StrutsPrepareAndExecuteFilter的时候会执行过滤器中的 ...

  6. Wifi密码破解实战

    原文链接地址:http://www.freebuf.com/articles/wireless/127261.html https://www.baidu.com/?tn=98012088_4_dg& ...

  7. bzoj2621: [Usaco2012 Mar]Cows in a Skyscraper(状压DP)

    第一眼是3^n*n的做法...然而并不可行T T 后来发现对于奶牛的一个状态i,最优情况下剩下那个可以装奶牛的电梯剩下的可用重量是一定的,于是我们设f[i]表示奶牛状态为i的最小电梯数,g[i]为奶牛 ...

  8. 流媒体协议之RTSP客户端的实现20171014

    RtspClient是基于jrtplib实现的,目前仅支持h264格式,后续将不断迭代优化,加入对其他格式的支持,并且将实现RTSP的服务端. RtspClient的功能是接收服务端过来流,然后写入到 ...

  9. Codeforces 311.E Biologist

    E. Biologist time limit per test 1.5 seconds memory limit per test 256 megabytes input standard inpu ...

  10. 洛谷P1078 文化之旅

    P1078 文化之旅 1.1K通过 3.6K提交 题目提供者洛谷OnlineJudge 标签NOIp普及组2012 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨 ...