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. G: Dave的时空迷阵(next数组)

    G: Dave的时空迷阵 Time Limit: 1 s      Memory Limit: 128 MB Submit My Status Problem Description 皇家理工本部隐藏 ...

  2. 目标检测算法之YOLOv3

    参考地址:https://blog.csdn.net/leviopku/article/details/82660381 YOLO v3结构图 DBL:卷积+BN+leaky relu,是v3的最小组 ...

  3. 547. Friend Circles

    There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...

  4. 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分+线段树区间合并

    题解: 好像和noi那题并没有什么区别 只是加上了修改和变成树上 比较显然我们可以用树链剖分来维护

  5. python全栈开发day87~91-整个流程梳理、CRM功能、知识点梳理

    1.流程 1. stark组件 1. 启动 2.注册 3.url设计 4.视图函数设计 1.展示数据头 2.展示数据 3.list_display功能实现 4.list_display_links 功 ...

  6. gitlab之三: gitlab邮件通知的配置

    参考 :  https://www.cnblogs.com/lovelinux199075/p/9072265.html gitlab 添加新用户后,会自动发送邮件到填写的邮箱. 实验版本:  11. ...

  7. HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色

    原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1 ...

  8. 20165235 2018-3 《Java程序设计》第5周学习总结

    20165235 2018-3 <Java程序设计>第5周学习总结 教材学习内容总结 第六章 内部类与异常类 (一)内部类:1.java支持在一个类中定义另一个类,这个类叫内部类.2.内部 ...

  9. 组合数的简单求法(dfs)

    组合数的具体应用可以参考这个例子:https://www.cnblogs.com/FengZeng666/p/10496223.html 下面这段代码可以作为求组合数的固定套路或者公式: #inclu ...

  10. 怎样将一个Long类型的数据转换成字节数组

    直接上代码: //先写进去 long n = 1000000L; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutpu ...