Description

求长度为 \(2n\) 的序列.要求

1. \(a_1<a_3<a_5<...<a_{2n-1}\) .

2. \(a_2<a_4<a_6<...<a_{2n}\) .

3. \(a_{2k-1}<a_{2k} ,1\leqslant k\leqslant n\) .

Sol

\(Catalan\) 数.

我们发现 \(a_{2k}\) 必然要大于它前面的所有奇数项.

如果我们把数字 \(1,2,3,...,2n-1,2n\) 全部列出来,它只有两种决策,一种是放入奇数项,一种是放入偶数项.

我们就可以DP了...

\(f[i][j]\) 表示前 \(i\) 个数,其中 \(j\) 个放入奇数项的方案数.

转移就是 \(f[i][j]=f[i-1][j-1]+f[i-1][j]\) .

不过转移是有条件的,需要满足 \(j \leqslant  \left \lfloor \frac {i} {2} \right \rfloor \) .

然后这就是 \(Catalan\) 数的一个应用了,不跨过图上直线 \(y=x\) ,此时只需要令 \(k=\frac {i} {2},j \leqslant k\) 就可以看出来了.

还有一个问题就是 \(p\) 不是质数,在两个数不互质的时候没有逆元,所以我们需要分解质因数来计算,可以用线性筛筛出最小质因子,每次除去就可以统计出来了.

因为每个数的质因子个数不超过 \(logn\) ,所以复杂度 \(O(nlogn)\)

Code

/**************************************************************
Problem: 1485
User: BeiYu
Language: C++
Result: Accepted
Time:660 ms
Memory:26680 kb
****************************************************************/ #include<cstdio>
#include<iostream>
using namespace std; typedef long long LL;
const int N = 2000005; int n,cnt;LL p,ans;
bool b[N];int minp[N],pr[N],c[N]; void Pre(int LIM){
minp[1]=1;
for(int i=2;i<=LIM;i++){
if(!b[i]) pr[++cnt]=i,minp[i]=cnt;
for(int j=1;j<=cnt && pr[j]*i<=LIM ;j++){
b[pr[j]*i]=1,minp[pr[j]*i]=j;
if(i%pr[j]==0) break;
}
}
}
LL Pow(LL a,LL b,LL res=1){ for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;return res; }
void Add(int x,int v){ while(x>1) c[minp[x]]+=v,x/=pr[minp[x]]; }
int main(){
cin>>n>>p;
Pre(2*n); // for(int i=1;i<=cnt;i++) cout<<pr[i]<<" ";cout<<endl;
// for(int i=1;i<=n;i++) cout<<minp[i]<<" ";cout<<endl; for(int i=n+2;i<=2*n;i++) Add(i,1);
// cout<<"qwq"<<endl;
for(int i=1;i<=n;i++) Add(i,-1); ans=1;
for(int i=1;i<=cnt;i++) ans=ans*Pow(pr[i],c[i])%p;
return cout<<ans<<endl,0;
}

  

BZOJ 1485: [HNOI2009]有趣的数列的更多相关文章

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

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

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

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

  3. bzoj 1485 [HNOI2009]有趣的数列 卡特兰数

    把排好序的序列看成一对对括号,要把他们往原数列里塞,所以就是括号序合法方案数 即为卡特兰数 f(n)=Cn2nn+1 求的时候为避免除法,可以O(n)计算每个素数出现次数,最后乘起来,打完之后发现其实 ...

  4. 【BZOJ】1485: [HNOI2009]有趣的数列

    [算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为 ...

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

    1485: [HNOI2009]有趣的数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2105  Solved: 1117[Submit][Stat ...

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

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

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

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

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

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

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

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

随机推荐

  1. IDEA 搭建的SpringMVC Maven项目出现的问题

    1.添加jar包时,报添加某个jar包有问题,在pom.xml文件的project节点上有红波浪线 jar引用的maven地址没有问题,就是报错 解决办法:到本地仓库把相关jar包删掉重新下载 2.各 ...

  2. codeforces 719A Vitya in the Countryside(序列判断趋势)

    题目链接:http://codeforces.com/problemset/problem/719/A 题目大意: 题目给出了一个序列趋势 0 .1 .2 .3 ---14 .15 .14 ----3 ...

  3. php引入lucene方法

    在引入Lucene之前,先说下PHP JAVA Bridge的概念: PHP JAVA Bridge:就是在PHP和Java之间搭建一座桥梁,利用这座桥梁在这两个实体之间建立起一个沟通渠道,在这座桥梁 ...

  4. 工具,如何去掉百度编辑器 ueditor 元素路径、字数统计等

    去掉如下截图: 在百度编辑器 ueditor 根目录下: ueditor.config.js 文件中 搜索并将参数elementPathEnabled设置成false即可 常用功能开关如下: ,ele ...

  5. HBase命令(一) -- 库操作

    打开数据库 bin/start-hbase.sh //打开HBase bin/hbase shell //以命令行的方式打开Hbase控制台 Rest接口开启 bin/hbase rest //普通的 ...

  6. C# Redis消息队列例子

    class Program { //版本2:使用Redis的客户端管理器(对象池) public static IRedisClientsManager redisClientManager = ne ...

  7. 在github上创建新分支

    在github上创建仓库: Create a new repository on the command line touch README.md git init git add README.md ...

  8. iOS- Could not find a storyboard named 'Main' in bundle NSBundle

    1.删掉工程中main.storyboard 后要删除plist文件中对应的键值,否则会报如下错误: Could not find a storyboard named 'Main' in bundl ...

  9. linux下的chm阅读器?

    pre和code标签是可以同时使用的, 通常pre放在code的前面. 由于 code, pre中不能使用 换行, 段落, 和 尖括号标签, 所以, 对于尖括号, 要换成 html的 实体符号 < ...

  10. Memcached基础知识

    主要内容: Memcached基本的工作原理 Memcached的两阶段哈希 Memcached的数据存储方式 Memcached新建Item分配内存过程 Memcached的数据过期方式 Memca ...