[ZJOI2010]Perm
[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(){;}
[ZJOI2010]Perm的更多相关文章
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- 2111: [ZJOI2010]Perm 排列计数
2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
- BZOJ2111: [ZJOI2010]Perm 排列计数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2< ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i ...
- [BZOJ2111][ZJOI2010]Perm排列计数(组合数学)
题意就是求一个n个点的堆的合法形态数. 显然,给定堆中所有数的集合,则这个堆的根是确定的,而由于堆是完全二叉树,所以每个点左右子树的大小也是确定的. 设以i为根的堆的形态数为F(i),所以F(i)+= ...
- 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 ...
随机推荐
- 2-sat总结
算法 构造一个有向图G,每个变量xi拆成两个点2i和2i+1 分别表示xi为假,xi为真 那么对于“xi为真或xj为假”这样的条件 我们就需要连接两条边 2*i —>2*j(表示如果i为假,那么 ...
- 【转载】基于AFNetWorking3.0的图片缓存分析
原文出处: Yasin的简书 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.CoreData…).我们常说的网络请求缓存包 ...
- 【转载】greenplum数据库引擎探究
Greenplum做为新一代的数据库引擎,有着良好的发展与应用前景.强大的工作效率,低成本的硬件平台对数据仓库与商业智能建设有很大的吸引力.要清楚的了解其特点最好从架构着手. 架构分析 Greenp ...
- PCB genesis连孔加除毛刺孔(圆孔与圆孔)实现方法(一)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- js产生随机数教程
<script> function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random() ...
- Comet OJ - Contest #3 题解
传送门 太菜了连\(D\)都做不出来没有小裙子\(QAQ\) \(A\) 暴力把所有的数对都算出来,然后\(sort\)一下就行了 const int N=505; int a[N],st[N*N], ...
- ACM_“IP地址”普及(进制转换)
“IP地址”普及 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大家都知道最近广财大校园网提速,现在就跟大家普及一下简单的互联网 ...
- [转]mysql的约束
转自:http://blog.csdn.net/kqygww/article/details/8882990 MySQL中约束保存在information_schema数据库的table_constr ...
- jq-文本框只能输入数字
<input type="text" onKeyUp="value=value.replace(/\D/g,'')" /> onKeyUp: 当输 ...
- Microsoft SQL Server 2008/2012 Internals 一处疑问
Kalen Delaney 等著的深入解析 Microsoft SQL Server 系列,享有盛誉,深入研读,是管窥深奥复杂之 SQL Server 的阶梯与门径.手头有 Microsoft SQL ...