[ZJOI2010]Perm

题目

称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值

INPUT

输入文件的第一行包含两个整数 n和p,含义如上所述。

OUTPUT

输出文件中仅包含一个整数,表示计算1,2,?, ???的排列中, Magic排列的个数模 p的值。

SAMPLE

INPUT

20 23

OUTPUT

16

解题报告

这竟然是一道树规= =

其实想明白之后挺简单的

我们考虑一颗满二叉树,一个节点$i$如果有左儿子,那么它的左儿子编号一定为$i\times 2$,如果它有右儿子,那么它的右儿子编号一定为$i\times 2+1$

再回来看这道题,假如我们建一颗满二叉树,那么问题不就转化成所有儿子的权值都比父亲的权值大的方案数么?

设$f[size[i]]$代表编号为$i$的节点的方案数

我们要取出$i-1$个(把自己去掉)比它大的数,一部分放在左子树,一部分放在右子树,且当左子树确定了取出哪些数时,右子树所取出的数也是一定的

故我们可以推出状态转移方程:

$$f[size[i]]=C_{size[i]-1}^{size[i<<1]}\times f[size[i<<1]]\times f[size[i<<1|1]]$$

然后实现即可

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long L;
L n,p;
L fac[];
inline L po(L x,L hm){
L ret();
while(hm){
if(hm&)
ret=ret*x%p;
x=x*x%p;
hm>>=;
}
return ret;
}
inline L C(int n,int m){
return fac[n]*po(fac[m],p-)%p*po(fac[n-m],p-)%p;
}
struct edge{
int e;
edge *n;
}a[],*pre[];
int tot;
inline void insert(int s,int e){
a[++tot].e=e;
a[tot].n=pre[s];
pre[s]=&a[tot];
}
int size[];
inline void get_size(int u){
size[u]=;
for(edge *i=pre[u];i;i=i->n){
int e(i->e);
if(!size[e]){
get_size(e);
size[u]+=size[e];
}
}
}
L f[];
inline void dfs(int u){
if(u>n){
// size[u]=0;
// f[0]=1;
return;
}
// cout<<u<<endl;
// size[u]=1;
dfs(u<<);
// size[u]+=size[u<<1];
dfs(u<<|);
// size[u]+=size[u<<1|1];
f[size[u]]=C(size[u]-,size[u<<])*f[size[u<<]]%p*f[size[u<<|]]%p;
}
inline int gg(){
// freopen("permzj.in","r",stdin);
// freopen("permzj.out","w",stdout);
scanf("%lld%lld",&n,&p);
fac[]=fac[]=;
for(int i=;i<=n;++i){
L tmp(i);
while(tmp%p==)
tmp/=p;
fac[i]=fac[i-]*tmp%p;
}
for(int i=;i<=n;++i){
if((i<<)>n)
break;
insert(i,i<<);
if((i<<|)>n)
break;
insert(i,i<<|);
}
get_size();
f[]=f[]=;
dfs();
printf("%lld",f[n]%p);
// for(int i=1;i<=n;++i)
// cout<<"i="<<i<<" size[i]="<<size[i]<<endl;
return ;
}
int K(gg());
int main(){;}

最新文章

  1. linux top 源码分析
  2. cocos2dx 3.8版关于#include &quot;GB2ShapeCache-x.h&quot;
  3. Eclipse安装easyShell插件
  4. SQL Server2008如何设置开启远程连接
  5. ASP.NET HttpRuntime.Cache缓存类使用总结
  6. BibTex参考文献制作
  7. HTML ISO-8859-1 参考手册
  8. hdu 5264 pog loves szh I
  9. linux安装缺失服务
  10. 联想V480关闭UEFI安装Win7
  11. Hash 表详解(哈希表)
  12. 一口一口吃掉Hibernate(八)——Hibernate中inverse的用法
  13. Hadoop-2.2.0中国文献—— Web应用代理
  14. git 忽略已跟踪的文件
  15. mysql的连接
  16. kubernetes常用命令
  17. PHP与Python哪个做网站产品好?
  18. 【CS231N】2、多类SVM
  19. 嘘,如何激活更新的win10
  20. SpringBoot (六) :如何优雅的使用 mybatis

热门文章

  1. [BZOJ 2199] 奶牛议会
  2. java—容器学习笔记
  3. SRAM and DRAM
  4. Appium + python -yaml配置文件
  5. 判断IOS静态库(.a文件)是否支持模拟器和真机运行
  6. JavaScript--Date 日期对象
  7. jmeter中对于各类时间格式的设置
  8. python框架之虚拟环境的配置
  9. ionic2 打包时报错 file-opener2
  10. 快速学习mybatis框架