【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种想法(实质上是一样 ...
随机推荐
- iOS- 如何建立索引实现本地文本搜索引擎,允许容错搜索?
1.前言 实现一个本地搜索引擎,允许容错搜索,也就是搜索结果不需要和搜索的关键字完全精准匹配.比如,搜索”eric wang“,搜索结果可以包括Erica Watts等等.搜索效率十分高. 这里我们需 ...
- 【Mark】Android应用开发SharedPreferences存储数据的使用方法
Android应用开发SharedPreferences存储数据的使用方法 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的 ...
- Ubuntu 16.04出现:Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/
转自:http://blog.csdn.net/zzq123686/article/details/77454066 出现错误信息: Reading package lists... Done E: ...
- windows操作系统下载tomcat,并与eclipse进行整合
进入Tomcat官网之后,在左边我们看到,Tomcat的有6,7,8这三个最流行的版本,我们可以点击进去下载想要的版本. 进入里面之后,可以看见有64位的和32位的,就看自己的电脑是多少位的了,如果电 ...
- Spring 学习 5- task 定时任务
Spring-Task 1.这是网上的: 后面是我自己的配置 Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spri ...
- IE8 没有内容的盒子,如果有定位,浮现在其他盒子上 可能会有点击穿透没有作用的情况
IE8 没有内容的盒子,如果有定位,浮现在其他盒子上 可能会有点击穿透没有作用的情况
- 第196天:js---调用函数的五种方式
一.普通方式 /*普通模式*/ // 声明一个函数,并调用 function func() { console.log("Hello World"); } func(); 二.函数 ...
- HDU 4767——Bell
昨天比赛被虐的这个题目. 今天听斌牛讲过他的思路后就A掉了. 题目的意思是要你求出bell数的第n项对95041567取模. 首先,95041567=31*37*41*43*47: 然后取模就是先分别 ...
- 【Java】全站编码过滤器GenericEncodingFilter代码与配置
编码过滤器GenericEncodingFilter: package com.fuck.web.filter; import java.io.IOException; import java.i ...
- 导出ORACLE表结构到SQL语句(含CLOB)
转自:http://blog.itpub.net/84738/viewspace-442854/ 先用exp导出空表 exp username/password rows=n file=expor ...