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

Input

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

Output

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


DP方程的形式对本题影响重大!

发现奇数位置对应唯一的偶数位置,且第i个奇数位置最大$2i-1$,所以只考虑奇数位置,写一个DP:

$f[i][j] $表示前i个奇数位置最大j的方案数

然后只能优化到$O(n^2)$

找啊找从beiyu那里发现另一种方程:

$f[i][j]$ 前i个数,j个放在奇数位置的方案数

限制条件$\frac{i}{2} \le j \le i$并且最终奇数位置放了n个

这不就是Catalan数的走格子模型吗?

并且这个DP方程就是做那道走格子题目最原始的方程,放在奇数是向左走

这些数字是从小到大放进那些位置里,(这样避免了考虑大小影响),并且每一时刻放在奇数位置的个数一定大于等于放在偶数位置的个数,这样就和原始定义里的$+1\quad -1$对应起来啦!

重要的地方在于想到把数字从小到大放进去而不是从左到右考虑每个位置

然后本题没法求逆元,需要质因子分解,这种n小的情况直接保存lp[]就行了,超快

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=2e6+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,MOD;
bool notp[N];
int p[N],lp[N];
void sieve(int n){
for(int i=;i<=n;i++){
if(!notp[i]) p[++p[]]=i,lp[i]=p[];
for(int j=;j<=p[]&&i*p[j]<=n;j++){
notp[i*p[j]]=;
lp[i*p[j]]=j;
if(i%p[j]==) break;
}
}
}
int e[N];
void add(int x,int d){
while(x!=){
e[lp[x]]+=d;
x/=p[lp[x]];
}
}
void solve(){
ll ans=;
for(int i=*n;i>=n+;i--) add(i,);
for(int i=;i<=n;i++) add(i,-);
add(n+,-);
for(int j=;j<=p[];j++) for(;e[j];e[j]--) ans=ans*p[j]%MOD;
printf("%lld",ans);
}
int main(){
freopen("in","r",stdin);
n=read();MOD=read();
sieve(n<<);
solve();
}

最新文章

  1. jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数
  2. Sublime Text 3 引用插件
  3. BizTalk开发系列(十一) 在Orchestration中执行Pipeline
  4. Summarize Series For Burying My College
  5. Hibernate逍遥游记-第15章处理并发问题-001事务并发问题及隔离机制介绍
  6. 【九度OJ】题目1096-二分查找
  7. HDOJ(HDU) 1465 不容易系列之一(错排)
  8. [Swust OJ 1139]--Coin-row problem
  9. Block 朴实理解
  10. thinkphp5URL和路由
  11. RSA 格式 - 转载
  12. ElasticSearch启动错误处理方法
  13. 使用nginx搭建rtmp服务器
  14. FloatingActionButton FAB 悬浮按钮
  15. 洗礼灵魂,修炼python(22)--自定义函数(3)—函数作用域,闭包
  16. websocket(三)——基于node sockit.io的即时通讯
  17. Win7任务栏合并
  18. Unity shader学习之Alpha Blend
  19. 一些减少代码量、提高开发效率的利器(Java)
  20. 你对position的了解有多少?

热门文章

  1. node中定时器, process.nextTick(), setImediate()的区别与联系
  2. Java Web学习路线图
  3. Mac 终端 shell 公钥失效解决办法
  4. ssh密码
  5. 【编程技巧】addSubview和insertSubview的区别
  6. WinForm中,设置不显示窗口的标题栏
  7. 优化 or 语句
  8. JavaSE-反射-获取类或者对象的四种方法
  9. python_斐波那契数列
  10. 解决service层无法注入