题目描述

我们称一个长度为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的值。

输入输出样例

输入样例#1:

3 10
输出样例#1:

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:

  本题zyys。

  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$,由乘法原理知,总方案数为$\frac{C(2n,n)}{n+1}$;

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

  3.用线性筛法求出$[1,2n]$的$mindiv$(最小质因数),将分母分子分解质因数;

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

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)>(b)?(b):(a))
using namespace std;
const int N=;
ll n,mod,ans,cnt,prime[N],isprime[N],minn[N],tot[N]; il ll fast(ll s,ll k){
ll ans=;
while(k){
if(k&)ans=ans*s%mod;
k>>=;
s=s*s%mod;
}
return ans;
} int main(){
ios::sync_with_stdio();
cin>>n>>mod;
For(i,,n<<){
if(!isprime[i])prime[++cnt]=i;
for(int j=;j<=cnt&&prime[j]*i<=(n<<);j++){
isprime[prime[j]*i]=;
minn[prime[j]*i]=prime[j];
if(i%prime[j]==)break;
}
}
For(i,n+,n<<) {
int p=i;
while(minn[p])tot[minn[p]]++,p=p/minn[p];
tot[p]++;
}
For(i,,n) {
int p=i;
while(minn[p])tot[minn[p]]--,p=p/minn[p];
tot[p]--;
}
ll ans=;
For(i,,cnt) ans=ans*fast(prime[i],tot[prime[i]])%mod;
cout<<ans;
return ;
}

P3200 [HNOI2009]有趣的数列的更多相关文章

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

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

  2. P3200 [HNOI2009]有趣的数列--洛谷luogu

    ---恢复内容开始--- 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3& ...

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

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

  4. Luogu P3200 [HNOI2009]有趣的数列

    题意 给定 \(n\),求有多少个长度为 \(2n\) 的排列 \(p\) 满足 对于 \(1\leq i\leq n\),\(p_{2i-1}<p_{2i}\). \(p_1<p_3&l ...

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

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

  6. BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]

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

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

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

  8. 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)

    [BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...

  9. [HNOI2009]有趣的数列 题解(卡特兰数)

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

随机推荐

  1. 初探12C碰到的那些“坑”

    一个昏天黑地的早上,刚搭建的系统忽然遭遇严重数据库问题.于是,主要人物闪亮登场了,他们分别是友商人员小灰和DBA小Y. 事情的开始,小Y接到小灰紧急救助电话... 小灰:小Y,我是友商的小灰,刚搭建的 ...

  2. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  3. 网页头部ico 不显示

    这个都是很基础的东西,.今天整理以前的笔记,看到了记录一下 <link rel="shortcut icon" href="/favicon.ico"/& ...

  4. Linux下vim操作的一些使用技巧

    以下均为个人在编程时对vim编辑器的一些心得,大神请指点,新手可以看过来 1.多文本编辑 vim -On/-on filename_1 … filename_n 如上所示,在要编辑的文件名前加上“-O ...

  5. python json.dumps raise TypeError(repr(o) + " is not JSON serializable") TypeError: 0 is not JSON serializable

    出错如题. 这个问题有可能是因为python的json.dumps没法识别dump内容里的某些数据类型导致的.我的问题是因为dict中含有numpy.int64,numpy.float等类型导致的,需 ...

  6. git分布式版本控制系统常用的操作

    Git是一个版本控制系统,用来追踪计算机文件的变化的工具,也是一个供多人使用的协同工具.它是一个分布式的版本控制系统,本文将简单介绍如何使用.简单来说,就是你要和你的伙伴一起完成一项任务,但是你们要互 ...

  7. 在程序开发中,++i 与 i++的区别

    在不参与运算的情况下,i++和++i都是在变量的基础加1 ◆在参与运算的情况下 Var i=123; Var j=i++;  先将i的值123赋值给j,之后再自增 j的值为123  i 的值为124 ...

  8. java中substring()、charAt()、indexOf() (2013-05-05-bd 写的日志迁移

    substring 1. public String substring(int beginIndex)     返回一个新的字符串,它是此字符串的一个子字符串, 该子字符串始于指定索引处的字符,一直 ...

  9. scrapy之分布式

    分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取. 原生的scrapy是不可以实现分布式爬虫? a) 调度器无法共享 b) 管道无法共享 工具 scrapy-redis组件: ...

  10. java变量、数据类型

    public class Test { public static void main(String[] args) { //变量 //数据类型 变量名; //基本数据类型: //一个字节8位 //整 ...