题意就是求一个n个点的堆的合法形态数。

显然,给定堆中所有数的集合,则这个堆的根是确定的,而由于堆是完全二叉树,所以每个点左右子树的大小也是确定的。

设以i为根的堆的形态数为F(i),所以F(i)+=F(sz[2*i])*F(sz[2*i+1])*C(sz[i]-1,sz[2*i])。直接DP即可。

有个令人无语的坑,n可能大于p,要用Lucas。

还有求阶乘逆元的时候根本不需要用快速幂算出fac[n]的逆元再逆推回去,直接跟阶乘一样顺推就好了。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int n,p,fac[N],inv[N],Fin[N],s[N],f[N]; int C(int n,int m){
if (n<m) return ;
if (n<p && m<p) return 1ll*fac[n]*Fin[m]%p*Fin[n-m]%p;
return 1ll*C(n/p,m/p)*C(n%p,m%p)%p;
} int main(){
freopen("bzoj2111.in","r",stdin);
freopen("bzoj2111.out","w",stdout);
scanf("%d%d",&n,&p); int m=min(n,p);
fac[]=; rep(i,,m) fac[i]=1ll*fac[i-]*i%p;
inv[]=; rep(i,,m) inv[i]=1ll*(p-p/i)*inv[p%i]%p;
Fin[]=; rep(i,,m) Fin[i]=1ll*Fin[i-]*inv[i]%p;
for (int i=n; i; i--){
s[i]=s[i<<]+s[(i<<)|]+;
f[i]=1ll*((i<<)>n?:f[i<<])*((i<<|)>n?:f[i<<|])%p*C(s[i]-,s[i<<])%p;
}
printf("%d\n",f[]);
return ;
}

[BZOJ2111][ZJOI2010]Perm排列计数(组合数学)的更多相关文章

  1. [BZOJ2111]:[ZJOI2010]Perm 排列计数(组合数学)

    题目传送门 题目描述 称一个1,2,...,N的排列${P}_{1}$,${P}_{2}$,...,${P}_{N}$是Magic的,当且仅当2≤i≤N时,${P}_{i}$>${P}_{\fr ...

  2. BZOJ2111: [ZJOI2010]Perm 排列计数

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2< ...

  3. [bzoj2111][ZJOI2010]Perm 排列计数 ——问题转换,建立数学模型

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

  4. 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数

    [BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...

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

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

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

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

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

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

  8. BZOJ_2111_[ZJOI2010]Perm 排列计数_树形DP+组合数学

    Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...

  9. 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理

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

随机推荐

  1. oracle的sequece的使用(主键自增长)

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  2. sql注入预防

    在我们登陆验证时会发现sql注入的现象. 1.sql注入发生原因 因为如果用户在用户名上输入的是' or 1=1 # 时,我们得到的sql语句是select * from shop_user wher ...

  3. unity中绘制战争迷雾

    接上一篇中说的游戏,我们已经实现了client.host上的一个物体可见不可见的行为.之后我们可以加入类似检查两个单位之间的距离.或是两个单位之间有无阻挡物来进一步实现游戏机制. 在这篇随笔中我会首先 ...

  4. 也说JS脚本加载控制

    问题背景 前端采用的 iframe + html 做后台管理系统.现在js.jquery插件非常多,每次页面都是引用就类似这样: <script src="../Scripts/jqu ...

  5. spring自定义参数绑定(日期格式转换)

    spring参数绑定时可能出现 BindException(参数绑定异常),类似下面的日期绑定异常(前台传过来是String类型,实际的pojo是Date类型) default message [Fa ...

  6. Ansible在节点间传输文件

    1. 在控制节点(the control machine )与远程节点( the current remote host)之间传输文件 1.1 如果需要传输文件,可以使用copy模块,注意copy模块 ...

  7. C++高精度

    整理了一下高精度,虽然可用java,但很多时候还是C++写的方便. 附上kuangbin神的高精度模板(HDU1134 求卡特兰数) #include <iostream> #includ ...

  8. onvif实现

    前言 负责开发了公司的onvif,一个人从0开始写的,花了两个月 !!!下面是我的总结. onvif介绍 ONVIF[Open Network Video Interface Forum](开放型网络 ...

  9. Makefile PHONY

    case 1: Makefile clean: rm a environment_1 : There is only file a $ make clean clean a environment_2 ...

  10. Oracle rman 全备份的一个小例子

    run{  allocate channel d1 type disk;  backup database format='/u01/backup/%T_%d_%s.bak';  sql 'alter ...