【题目】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. iOS开发面试题整理

    前言 本文借鉴整理了iOS高级开发常见的面试题,并且分博客一一分析,希望能和大家一起进步学习. 欢迎大家关注我的 Github

  2. 毕业回馈-89c52之最小系统

    今天分享一个51单片机最小系统的电路板设计(原理图+PCB) 技术手册上面对于51单片机最小系统作如下要求: 下载电路主要有以下几种: 采用RS-232转换器下载:(R1OUT-P3.0;T1IN-P ...

  3. hadoop-lzo 安装配置

           在hive中要想使用lzo的格式,需要配置安装好lzo工具并且在hadoop的core-site.xml与mapred-site.xml中配置相应的配置 一.编译安装lzo与lzop 在 ...

  4. 小学四则运算APP 第一个冲刺阶段 第一天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 思考:初步了解小学四则运算数是在100以内的加减乘除,首先先从简单的地方入手,把最基础的算法功 ...

  5. [福大软工] Z班 个人项目自动测试结果

    个人项目第二次测试结果[9.16] 注:下表中的成绩满分为25分,正确性测试 共5个,每个3分.效率测试共 2个,每个5分. 根据数据统计分档如下, // 前为档级,后为分数. 参数为50000 0- ...

  6. Linux命令(二十七) 用户组管理命令

    Linux提供了一系列的命令管理用户组.用户组就是具有相同特征的用户集合.每个用户都有一个用户组,系统能对一个用户组中所有用户进行集中管理,通过把相同属性的用户定义到同一用户组,并赋予该用户自一定的操 ...

  7. iOS—— iOS 内存管理:增长+泄漏

    1.如果是循环中局部变量data没有释放导致的,给NSData 手动添加释放池 @autoreleasepool { your code } 2.url 转变字典key值的时候出现内存暴增! //设置 ...

  8. webapi Route 特性

    转载:http://www.th7.cn/Program/net/201410/302571.shtml ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程 ...

  9. Day18-前端和后端怎么区分

    前端 - 通常是针对浏览器而开发的,是在浏览器端运行的程序,而后端 - 针对的是服务器,准确的来说应该是服务器端开发.前端开发偏向于用户体验,比较直观,服务器端开发偏向于性能. 前端和后端指的是网站建 ...

  10. 简单prufer应用

    [bzoj1005] Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? ...