【算法】Catalan数

【题解】

学了卡特兰数就会啦>_<!

因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一。

那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢。

将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数。

然后其实这种题目,打表就可知啦……QAQ

然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数。

参考bzoj礼物的解法。

看到网上清一色的素数筛+分解质因数解法,思考了好久,感觉写了假的礼物……

后来试了一下发现礼物的做法慢得多,原因应该是礼物解法复杂度O(min(n,P))而且常数大,分解质因数O(n),但我觉得也带常数呀?

很奇怪……不过反正n太大只能用礼物的做法,不大的话分解质因数应该更快。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,maxn=; ll n,P,m,p[],pc[],M[],a[];
ll num,fac[maxn];
ll power(ll x,ll k,ll p)
{
ll ans=;
while(k>)
{
if(k&)ans=ans*x%p;
x=x*x%p;
k>>=;
}
return ans;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){x=;y=;return;}
else {exgcd(b,a%b,y,x);y-=x*(a/b);}
}
ll inv(ll x,ll p)
{
ll xx,yy;
exgcd(x,p,xx,yy);
return ((xx%p)+p)%p;
}
ll calc(ll x,ll p,ll pc)
{
if(x<p)return fac[x];
num+=x/p;
return fac[x%pc]*power(fac[pc-],x/pc,pc)%pc*calc(x/p,p,pc)%pc;
}
ll work(ll p,ll pc)
{
fac[]=;
for(ll i=;i<min(pc,*n+);i++)fac[i]=fac[i-]*(i%p==?:i)%pc;
num=;
ll n1=calc(*n,p,pc);
ll tmp=num;
for(ll i=;i<min(pc,*n+);i++)fac[i]=fac[i-]*(i%p==?:inv(i,pc))%pc;
num=;
ll n2=calc(n,p,pc)*calc(n,p,pc)%pc;
ll np=n+;
while(np%p==){num++;np/=p;}
n2=n2*inv(np,pc)%pc;
return n1*n2*power(p,tmp-num,pc)%pc;
} int main()
{
scanf("%lld%lld",&n,&P);
m=;ll nowP=P;
for(ll i=;i*i<=nowP&&nowP>;i++)
{
if(nowP%i==){p[++m]=i;pc[m]=;}
while(nowP%i==){pc[m]*=i;nowP/=i;}
}
if(nowP>){p[++m]=nowP;pc[m]=nowP;}
ll ans=;
for(ll i=;i<=m;i++)
{
M[i]=P/pc[i];
a[i]=work(p[i],pc[i]);
ans=(ans+a[i]*M[i]%P*inv(M[i],pc[i])%P)%P;
}
printf("%lld",(ans%P+P)%P);//答案一定要记得取非负
return ;
}

礼物的做法

【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]有趣的数列

    Description 求长度为 \(2n\) 的序列.要求 1. \(a_1<a_3<a_5<...<a_{2n-1}\) . 2. \(a_2<a_4<a_6& ...

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

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

  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. Hash(散列函数)简单应用引出解决散列冲突的四种方法

    商店允许顾客通过电话订购商品,并在几天后上门自取.商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的).如何组织商店的数据库,以允许更加高效的进行 ...

  2. PAT L1-017 到底有多二

    https://pintia.cn/problem-sets/994805046380707840/problems/994805121500692480 一个整数“犯二的程度”定义为该数字中包含2的 ...

  3. (转)ActiveMQ的重连机制

    花了一天的时间,终于搞明白了我的疑问. failover://(tcp://localhost:6168)?randomize=false&initialReconnectDelay=100& ...

  4. C# 事件总线 EventBus

    1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需 ...

  5. MySQL专题 2 数据库优化 Slow Query log

    MySQL Server 有四种类型的日志——Error Log.General Query Log.Binary Log 和 Slow Query Log. 第一个是错误日志,记录 mysqld 的 ...

  6. Flume日志收集系统架构详解--转

     2017-09-06 朱洁 大数据和云计算技术 任何一个生产系统在运行过程中都会产生大量的日志,日志往往隐藏了很多有价值的信息.在没有分析方法之前,这些日志存储一段时间后就会被清理.随着技术的发展和 ...

  7. 51nod-1222-最小公倍数计数

    题意 给到 \(a,b\) ,求 \[ \sum _{i=a}^b\sum _x\sum _y[x\le y][\text{lcm}(x,y)=i] \] 即最小公倍数在 \([a,b]\) 中的有序 ...

  8. Oracle 10g DG 环境搭建详解

    环境描述:线上招聘库在物理机上,需要上云主机,于是申请两台云主机:由于云主机变态性,分配的云主机具有很多局限性:1.没有/tmp,2.没有 swap 3. /home 目录非常小:于是申请两块云硬盘, ...

  9. presence_of_element_located与visibility_of_element_located区别

    selenium 问题:加了显性等待后,操作元素依然出错   背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待 ...

  10. 题解 P1334 【瑞瑞的木板】

    声明:本题解已经与其他题解重合, ### 且存在压行情况. 首先,这个题解是我有了惨痛的教训:全部WA... 先发一个CODE做声明: #include <bits/stdc++.h> / ...