博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1485: [HNOI2009]有趣的数列
阅读量:5843 次
发布时间:2019-06-18

本文共 1399 字,大约阅读时间需要 4 分钟。

【算法】Catalan数

【题解】

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

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

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

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

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

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

参考的解法。

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

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

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

#include
#include
#include
#include
#include
#define ll long longusing namespace std;/*------------------------------------------------------------*/const int inf=0x3f3f3f3f,maxn=3000010;ll n,P,m,p[200],pc[200],M[200],a[200];ll num,fac[maxn];ll power(ll x,ll k,ll p){ ll ans=1; while(k>0) { if(k&1)ans=ans*x%p; x=x*x%p; k>>=1; } return ans;}void exgcd(ll a,ll b,ll &x,ll &y){ if(!b){x=1;y=0;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
1;i++) { if(nowP%i==0){p[++m]=i;pc[m]=1;} while(nowP%i==0){pc[m]*=i;nowP/=i;} } if(nowP>1){p[++m]=nowP;pc[m]=nowP;} ll ans=0; for(ll i=1;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 0;}
礼物的做法

 

转载于:https://www.cnblogs.com/onioncyc/p/7215075.html

你可能感兴趣的文章
win7 绑定arp
查看>>
云时代架构读后感4--IT架构的本质
查看>>
selenium界面元素定位
查看>>
关于tcmalloc\malloc和new
查看>>
win2008R2管理员密码修改文档
查看>>
Jenkins-Gitlab配置方法
查看>>
Linux上用户之间对话
查看>>
白盒测试用例设计方法
查看>>
sql查询从m到n的这几条记录
查看>>
【TensorFlow篇】--Tensorflow框架实现SoftMax模型识别手写数字集
查看>>
jquery方法.serializeArray()获取name和value并转为json数组
查看>>
OK335xS GPMC nand device register hacking
查看>>
html5-盒子模型
查看>>
iOS - OC Copy 拷贝
查看>>
FlashCache初体验
查看>>
jstl 处理Date 时间
查看>>
SQL根据细粒度为天的查询
查看>>
【汇编语言】DEBUG的使用
查看>>
ggplot画基本图形类型
查看>>
Nginx服务状态的监控
查看>>