【题目】BZOJ 2111

【题意】求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果。\(n \leq 10^6,p \leq 10^9\),p是素数。

【算法】计数DP+排列组合+lucas

【题解】令i的父亲为i/2,转化为要求给一棵n个点的完全二叉树编号使得儿子编号>父亲编号。

设\(f[i]\)表示以第i个点为根的子树的编号方案数(1~sz[i]的排列),考虑从两个儿子处转移。

排列的本质是大小关系,所以两个排列组合起来相当于对1sz[i<<1]和1sz[i<<1|1]进行任意组合(各自保持顺序),然后从头到尾重编号成1~sz[i<<1]+sz[i<<1|1]。再将新的编号分配回去。

两个固定排列组合的方案数实际上是将sz[i<<1|1]个“1”分成sz[i<<1]+1份的方案数,采用隔板法易得C(sz[i<<1]+sz[i<<1|1],sz[i<<1]),再枚举两个排列,即:

\[f[i]=f[l_i]*f[r_i]*\binom{sz[i]-1}{sz[l_i]}
\]

为了方便看,这里\(l_i=i<<1\),\(r_i=i<<1|1\)。

由于模数p可能比n小,会导致没有逆元,所以预处理1~min(n,p-1)的阶乘,然后用lucas求解组合数。

复杂度\(O(n)\)。

注意:n较大时线性预处理阶乘逆元保证复杂度,f数组全部初始化为1。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2000010;//
int n,MOD,fac[maxn],fav[maxn],sz[maxn],f[maxn];
void gcd(int a,int b,int &x,int &y){if(!b){x=1;y=0;}else{gcd(b,a%b,y,x);y-=x*(a/b);}}
int inv(int a){int x,y;gcd(a,MOD,x,y);return (x%MOD+MOD)%MOD;}
int c(int n,int m){return 1ll*fac[n]*fav[m]%MOD*fav[n-m]%MOD;}
int lucas(int n,int m){
if(n<0||m<0||n<m)return 0;
if(n<MOD)return c(n,m);
return 1ll*c(n%MOD,m%MOD)*lucas(n/MOD,m/MOD)%MOD;
}
int main(){
scanf("%d%d",&n,&MOD);int mx=min(MOD-1,n);
fac[0]=1;for(int i=1;i<=mx;i++)fac[i]=1ll*fac[i-1]*i%MOD;
fav[mx]=inv(fac[mx]);for(int i=mx;i>=1;i--)fav[i-1]=1ll*fav[i]*i%MOD;///
for(int i=1;i<=(n<<1|1);i++)f[i]=1;
for(int i=n;i>=1;i--){
sz[i]=sz[i<<1]+sz[i<<1|1]+1;
f[i]=1ll*f[i<<1]*f[i<<1|1]%MOD*lucas(sz[i]-1,sz[i<<1])%MOD;//
}
printf("%d",f[1]);
return 0;
}

【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas的更多相关文章

  1. bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

    bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...

  2. BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]

    2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1936  Solved: 477[Submit][ ...

  3. BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...

  4. bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i ...

  5. bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】

    是我想复杂了 首先发现大于关系构成了一棵二叉树的结构,于是树形dp 设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1} ...

  6. bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas

    题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大, ...

  7. bzoj 2111: [ZJOI2010]Perm 排列计数

    神题... 扒自某神犇题解: http://blog.csdn.net/aarongzk/article/details/50655471 #include<bits/stdc++.h> ...

  8. 2111: [ZJOI2010]Perm 排列计数

    2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...

  9. BZOJ.2111.[ZJOI2010]排列计数(DP Lucas)

    题目链接 对于\(a_i>a_{i/2}\),我们能想到小根堆.题意就是,求构成大小为\(n\)的小根堆有多少种方案. 考虑DP,\(f[i]\)表示构成大小为\(i\)的小根堆的方案数,那么如 ...

随机推荐

  1. VS2010带不出System.Data.OracleClient这个引用的解决方案

    在使用VS2010的时候有时会带不出System.Data.OracleClient这个引用,可以使用以下解决方法: 右击项目的属性,在弹出窗口中有一个“目标框架”下拉框选项,默认会是.NET FRA ...

  2. 【容器魔方解读】AWS Re:Invent 2018大会

    每年云计算领域技术与商业风向标之一的AWS Re:Invent大会上周在美国拉斯维加斯召开,如往届一样,AWS密集发布了上百项的新产品或新技术.随着国内近两年云计算尤其是公有云的普及度越来越高,国内各 ...

  3. EOS开发基础之六:使用cleos命令行客户端操作EOS——智能合约之eosio.msig和eosio.system

    上一节我们搞了老半天,也没整明白Exchange这个合约到底干啥用的.就它官方提供的说法,是用于货币的创造和交易.我没整明白,所以去看了下代码,发现代码头文件里面有下面这段话: This contra ...

  4. linux 内核 第二周 操作系统是如何工作的

    姬梦馨 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一:计算机的三个法宝 存储程序计算机工 ...

  5. 小组成员的github地址

    袁颖https://github.com/joanyy/test 魏晓 https://github.com/weixiaohaobaobao/test 张晓磊 https://github.com/ ...

  6. A brief introduction of myself

    来到博客园的第二天.晚上天色墨蓝,余热未退,北京这里的秋风干松爽利,和小组的伙伴们吃了一顿饱饱的香锅,按照咱们国人的传统,所有的事情在饭桌上都解决了,包括队员之间相互的认识和短期任务的分配以及后期的团 ...

  7. 使用Visual Studio 2013进行单元测试的过程与感想

    首先是安装Visual Studio 2013这个软件,尽管安装过程不复杂,但是安装的时间实在是太长了,经过2个多小时的安装终于装完了. 由于时间紧凑,没来得及装语言包,于是,我用了原装的进行了单元测 ...

  8. ElasticSearch 2 (35) - 信息聚合系列之近似聚合

    ElasticSearch 2 (35) - 信息聚合系列之近似聚合 摘要 如果所有的数据都在一台机器上,那么生活会容易许多,CS201 课商教的经典算法就足够应付这些问题.但如果所有的数据都在一台机 ...

  9. 从零开始学Kotlin-使用接口(7)

    从零开始学Kotlin基础篇系列文章 定义接口 使用关键字interface定义接口 interface InterfaceDemo7 { } 类或对象可以实现一个或者多个接口 class demo7 ...

  10. final阶段140字评论

    按课堂顺序 1约跑APP ,无论从页面还是从功能来看完整度都很高了.演示也用了能展示的方式.多些趣味性就更赞了. 2礼物挑选小工具,做了能在规定时间内的功能.也算是对礼物固话的一个成本最低的回应. 3 ...