BZOJ 1485: [HNOI2009]有趣的数列
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]有趣的数列的更多相关文章
- BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )
打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...
- BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]
1485: [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所 ...
- bzoj 1485 [HNOI2009]有趣的数列 卡特兰数
把排好序的序列看成一对对括号,要把他们往原数列里塞,所以就是括号序合法方案数 即为卡特兰数 f(n)=Cn2nn+1 求的时候为避免除法,可以O(n)计算每个素数出现次数,最后乘起来,打完之后发现其实 ...
- 【BZOJ】1485: [HNOI2009]有趣的数列
[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为 ...
- bzoj1485: [HNOI2009]有趣的数列(Catalan数)
1485: [HNOI2009]有趣的数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2105 Solved: 1117[Submit][Stat ...
- 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)
[BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...
- BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数
BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ ...
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
- [HNOI2009]有趣的数列 卡特兰数
题面:[HNOI2009]有趣的数列 题解: 观察到题目其实就是要求从长为2n的序列中选n个放在集合a,剩下的放在集合b,使得集合a和集合b中可以一一对应的使a中的元素小于b. 2种想法(实质上是一样 ...
随机推荐
- Linux 命令小记
1. pidof 进程名 :获取进程的pid,例如 pidof memcached 得到5333 2. unset Shell变量 :取消设置一个shell变量,从内存和shell的导出环境中删除它, ...
- pulltorefresh滚动到底部
如果用ListView,让它滚动到顶部,一般是这样写的: if (!listView.isStackFromBottom()) { listView.setStackFromBottom(true); ...
- C# unmanaged function pointers for iOS
C# unmanaged function pointers for iOS Just a reminder to myself when I need this thing next time fo ...
- Kindeditor 编辑器POST提交的时候会出现符号被转换
Kindeditor编辑器输入符号单引号,双引号,斜杠 都会被转义 解决办法 $date['content']=$this->textString($_POST['content']); pub ...
- adobe photoshop cc 2014 安装失败 解决办法之一
首先安装失败会有提示 首先贴下错误信息 Exit Code: 34 Please see specific errors below for troubleshooting. For example, ...
- step 3 socket
socket 网络通讯三要素 IP地址(主机名) 网络中设备的标示 不易记忆,可以用主机名 本地回环地址:127.0.0.1 主机名:localhost 每台计算机都有一个 127.0.0.1 如果 ...
- yum clean all 是什么意思
yum会将下载下来的 包文件rpm和头文件header存盘在 本地机器的硬盘 缓存中, 这个将占用 硬盘空间, 可以将这些内容清除掉, 以释放磁盘空间: yum clean headers: // 释 ...
- vim中添加molokai.vim 配色安装
无意中发现知乎中讨论的话题: 你认为最好看的 Vim 配色方案(color scheme)是哪款? 网友回答 排在第一位的是:molokai 啊,最经典的配色 既然molokai这么经典,当然要用了. ...
- 如何解压.bz2文件包
.bz2 解压1:bzip2 -d FileName.bz2 解压2:bunzip2 FileName.bz2 压缩: bzip2 -z FileName .tar.bz2 解压:tar j ...
- ls按时间排序输出文件列表
文件转自:http://www.2cto.com/os/201303/197829.html ls按时间排序输出文件列表 首先,ls --help查看ls相关的与时间排序相关的参数: > ...