[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. 在服务器中使用 Entity Framework 的 Migration 更新数据库

    在开发环境中,每次我们对要对数据库进行更改,比如增加修改表字段等.改好Entity类后,我们只需在Nuget程序包管理控制台运行 update-database 脚本却可: update-databa ...

  2. BETA预发布演示视频

    视频连接:优酷http://v.youku.com/v_show/id_XMTgxMjQxMjc0NA==.html?from=y1.7-2

  3. 修改表中的enum字段

    alter table 表名 modify 字段名 enum('system','audit','account','secadmin') DEFAULT NULL;

  4. 【Linux学习笔记】Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)

    http://blog.csdn.net/slvher/article/details/8864996 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm. ...

  5. 第160天:Http协议的详细总结

    一.HTTP协议 超文本传输协议(HyperText Transfer Protocol),缩写HTTP.通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource I ...

  6. mvc4扩展方法

    制作扩展方法,方便网页中使用,下面做了两个例子 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  7. BZOJ4915 简单的数字题

    不妨设a1<a2<a3<a4.显然第一问的答案是4,满足a1+a4=a2+a3,a1+a2|a3+a4,a1+a3|a2+a4.容易发现将其同时扩大k倍是仍然满足条件的,于是考虑gc ...

  8. vue项目 axios封装第二弹

    import axios from "axios"; import qs from "qs"; import { Message, MessageBox } f ...

  9. C++解析(22):父子间的冲突

    0.目录 1.同名覆盖 2.赋值兼容 3.函数重写遇上赋值兼容 4.小结 1.同名覆盖 子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么? 父子间的冲突: 子类可以定义父类中 ...

  10. lxm --- ans lb config

    lxm --- ans lb config #ANS2.2 Build 160.006 # Last modified by `save config`, Fri Oct 12 17:15:42 20 ...