2111: [ZJOI2010]Perm 排列计数

链接

题意:

  称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i>P_{i/2}$. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值

  虽然是中文题,但是想加上markdown。

思路:

  好题!

  lucas定理+dp。

  题目要求大小为n的小根堆的方案数,(即给定的二叉树的父节点大于子节点)。

  f[i] 表示以i为根的子树的方案数。siz[i]为大小,即所有的取值。(假设这个子树的取值是1~siz[i])

  f[i] = f[i*2] * f[i*2+1] * C(siz[i]-1,siz[i*2])。

  f[i*2],f[i*2+1]是左右子树中的取值为1~siz的方案数,所以如果随机给这个子树siz个不同的数,同样是一组合法的方案。(给定的siz个数,可以映射到1~n上)。  

  所以总方案数就是,从所有的数中,选siz[ls]个,给左子树的方案数(剩下的自然就是给右子树)。首先根一定是1,在剩下的所有数中(siz[i]-1),给左孩子siz[i*2]个数。就是后面的式子。

  问题:代码19行加入后,wa?

代码:

 #include<cstdio>
#include<algorithm>
#include<iostream> using namespace std;
typedef long long LL;
const int N = ; LL f[N],inv[N],dp[N],siz[N],t[N],p;
int n,mx; void init() {
f[] = f[] = inv[] = inv[] = t[] = t[] = ;
for (int i=; i<=mx; ++i) {
f[i] = (f[i-] * i) % p;
inv[i] = (-(p/i)*inv[p%i]) % p;
inv[i] = (inv[i] + p) % p;
t[i] = t[i-] * inv[i] % p;
// if (inv[i] * i % p != 1) cout << 'a';
}
}
LL Lucas(LL a,LL b) {
if (a < b) return ;
if (a < p && b < p)
return f[a]*t[b]%p*t[a-b]%p;
return Lucas(a/p,b/p)*Lucas(a%p,b%p)%p;
}
int main() {
cin >> n >> p;
mx = min(LL(n),p);
init();
for (int i=n; i>=; --i) {
siz[i] = siz[i<<] + siz[i<<|] + ;
dp[i] = Lucas(siz[i]-,siz[i<<]);
if ((i<<)<=n) dp[i] = (dp[i] * dp[i<<]) % p;
if ((i<<|)<=n) dp[i] = (dp[i] * dp[i<<|]) % p;
}
cout << dp[];
return ;
}

2111: [ZJOI2010]Perm 排列计数的更多相关文章

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

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

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

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

  3. 【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是素数 ...

  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 排列计数:Tree dp + Lucas定理

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

  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 排列计数【树形dp+lucas】

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

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

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

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

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

随机推荐

  1. Vue自定义class覆盖第三方组件原有样式

    一个vue文件可以写多个<style></style>, 如果在style加上socped代表本组件的样式,不污染全局. 如果需要覆盖第三方组件样式,则不能加scoped,因此 ...

  2. Android实时取景:用SurfaceView实现

    对于基于摄像头的Android应用,实时取景是一个基本前提,通过前置或后置摄像头持续获取捕获到的内容,可以进一步做处理(人脸检测.美颜.滤镜等). 所谓实时取景,简单说就是调用android的摄像头, ...

  3. 一脸懵逼学习HBase的搭建(注意HBase的版本)

    1:Hdfs分布式文件系统存的文件,文件存储. 2:Hbase是存储的数据,海量数据存储,作用是缓存的数据,将缓存的数据满后写入到Hdfs中. 3:hbase集群中的角色: ().一个或者多个主节点, ...

  4. EF分别使用IQueryable和IEnumerable实现更新和删除

    缺点 使用IQueryable无法跟踪,无法监控sql,无法使用SaveChanges(). 优点 使用IQueryable简单粗暴. class Program { static void Main ...

  5. bzoj 5099: [POI2018]Pionek

    题解: 还是比较简单的一道题 考虑现在有一个向量,当且仅当下一个向量与它夹角<90度这个向量的模长才会增加 接下来怎么做呢 如果我们去枚举初始向量,向量方向会随着新增向量而变化 随着不断顺时针的 ...

  6. alpha冲刺7/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺7 团队部分 后敬甲(组长) 过去两天完成了哪些任务 界面设计.图标设计 写博客 接下来的计划 准备下周答辩 跟进进 ...

  7. 【AtCoder】ARC073

    ARC 073 C - Sentou 直接线段覆盖即可 #include <bits/stdc++.h> #define fi first #define se second #defin ...

  8. Python_xml

    xml: 可扩展标记语言,用来标记数据,定义数据类型,主要用来传输和存储数据(和json差不多,不同语言或程序之间进行数据交换的协议) ET(xml.etree.ElementTree)中的几个类: ...

  9. spark操作Kudu之写 - 使用DataFrame API

    在通过DataFrame API编写时,目前只支持一种模式“append”.尚未实现的“覆盖”模式 import org.apache.kudu.spark.kudu._ import org.apa ...

  10. Codeforces 830D Singer House 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF830D.html 题解 考虑用 $dp[i][j]$ 表示深度为 $i$ 的树里,有 $j$ 条路径的方案数 ...