【BZOJ】1485: [HNOI2009]有趣的数列
【算法】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]有趣的数列的更多相关文章
- 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]有趣的数列
Description 求长度为 \(2n\) 的序列.要求 1. \(a_1<a_3<a_5<...<a_{2n-1}\) . 2. \(a_2<a_4<a_6& ...
- bzoj 1485 [HNOI2009]有趣的数列 卡特兰数
把排好序的序列看成一对对括号,要把他们往原数列里塞,所以就是括号序合法方案数 即为卡特兰数 f(n)=Cn2nn+1 求的时候为避免除法,可以O(n)计算每个素数出现次数,最后乘起来,打完之后发现其实 ...
- 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种想法(实质上是一样 ...
随机推荐
- IE报错:SCRIPT1010: 缺少标识符
原文 http://keenwon.com/989.html 昨天用IE11测试页面的时候,发现在文档模式调整到IE8的时候,会报错: 看了半天,百思不得其解,后来终于顿悟:delete是javasc ...
- iOS-封装UIPickerView
创建类WJPickerView继承与UIView ProvinceModel是省市的model,包含属性 @property (nonatomic, strong) NSString *provinc ...
- OSG学习:LOD、数据分页、动态调度
LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.在OSG的场景结点组织结 ...
- .NET中的堆(Heap)和栈(Stack)的本质
计算机的内存可以分为代码块内存,Stack内存和Heap内存.代码块内存是在加载程序时存放程序机器代码的地方. 栈(Stack)一般存放函数内的局部变量. 堆(Heap)一般存放全局变量和类对象实例等 ...
- Spring Security 入门详解
序:本文主要参考 spring实战 对里面的知识做一个梳理 1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完 ...
- ADO之command
connection command对象使用的数据库连接 commandText 执行的SQL语句 ExecuteNonQuery 执行不返回行的语句,如UPDATE等 Execu ...
- 集成学习—boosting和bagging异同
集成学习 集成学习通过构建并结合多个学习器来完成学习任务.只包含同种类型的个体学习器,这样的集成是“同质”的:包含不同类型的个体学习器,这样的集成是“异质”的.集成学习通过将多个学习器进行结合,常可获 ...
- 通过父类定位到子类 先将父类当作一个dom
通过父类定位到子类 先将父类当作一个dom 在此基础上在定位子类
- Python基础数据类型题
Python基础数据类型 题考试时间:三个小时 满分100分(80分以上包含80分及格)1,简述变量命名规范(3分) 1.必须是字母,数字,下划线的任意组合. 2.不能是数字开头 3.不能是pytho ...
- Qt——数据的隐式共享
一.隐式共享类 在Qt中有很多隐式共享类( Implicitly Shared Classes ),什么是隐式共享呢,请参考官方文档的说明. 好吧,翻译一下—— 许多C++类隐式地共享数据,使得资源使 ...