题意

题目链接

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

Sol

这辈子做不出的计数系列。

一眼小根堆没啥好说的。最关键的一点是:树的形态是可以递推出来的。

那么当前点$i$为根节点,大小为$siz[i]$,左/右儿子分别为$ls, rs$

那么$f[i] = C_{siz[i] - 1}^{siz[ls]} f[ls] \times f[rs]$

Lucas定理算组合数

  1. #include<cstdio>
  2. //#define int long long
  3. using namespace std;
  4. const int MAXN = 1e6 + ;
  5. inline int read() {
  6. char c = getchar(); int x = , f = ;
  7. while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  8. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  9. return x * f;
  10. }
  11. int N, P, fac[MAXN] = {}, ifac[MAXN], siz[MAXN], f[MAXN];
  12. int fastpow(int a, int p, int mod) {
  13. int base = ;
  14. while(p) {
  15. if(p & ) base = (1ll * base % mod * a % mod) % mod;
  16. a = (1ll * a % mod * a % mod) % mod; p >>= ;
  17. }
  18. return base % mod;
  19. }
  20. int C(int N, int M, int P) {
  21. if(M > N) return ;
  22. return 1ll * fac[N] % P * ifac[M] % P * ifac[N - M] % P;
  23. }
  24. int Lucas(int N, int M, int P) {
  25. if(!N || !M) return ;
  26. return Lucas(N / P, M / P, P) * C(N % P, M % P, P);
  27. }
  28. main() {
  29. N = read(); P = read();
  30. for(int i = ; i <= N; i++) fac[i] = 1ll * i * fac[i - ] % P;
  31. ifac[N] = fastpow(fac[N], P - , P);
  32. for(int i = N; i >= ; i--) ifac[i - ] = 1ll * i * ifac[i] % P;
  33. for(int i = N; i >= ; i--) {
  34. siz[i] = ;
  35. int ls = (i << ), rs = (i << | );
  36. if(rs <= N) siz[i] += siz[ls] + siz[rs], f[i] = 1ll * Lucas(siz[i] - , siz[ls], P) * f[ls] % P * f[rs] % P;
  37. else if(ls <= N) siz[i] += siz[ls], f[i] = f[ls];
  38. else f[i] = ;
  39. }
  40. printf("%d", f[]);
  41. return ;
  42. }
  43. /*
  44. 999999 1000000007
  45. */

洛谷P2606 [ZJOI2010]排列计数(组合数 dp)的更多相关文章

  1. 洛谷P2606 [ZJOI2010]排列计数 组合数学+DP

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

  2. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  3. 洛谷P2606 [ZJOI2010]排列计数(数位dp)

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

  4. ●洛谷P2606 [ZJOI2010]排列计数

    题链: https://www.luogu.org/problemnew/show/P2606题解: 组合数(DP),Lucas定理 首先应该容易看出,这个排列其实是一个小顶堆. 然后我们可以考虑dp ...

  5. 洛谷P2606 [ZJOI2010]排列计数

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

  6. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  7. P2606 [ZJOI2010]排列计数

    P2606 [ZJOI2010]排列计数 因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树.现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质. 设\(f(i)\)表示以\ ...

  8. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

  9. 洛谷 P2602 [ZJOI2010]数字计数

    洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...

随机推荐

  1. Vmware ESXi 6.5 安装手册

    1          安装前准备 1.1          硬件环境准备 无 备注: 本指导书以虚拟光驱.虚拟软驱为例,如使用物理光驱.物理软驱安装系统操作则以实际系统光盘.软盘代替. 1.2     ...

  2. C# Linq 取得两个列表的交集

    我们经常会用到linq 来查询 一个数组中和另一个数组中相同的项, 这个时候就会用到IEqualityComparer接口. public class StudyInfoModel {      pu ...

  3. μC/OS-II与RT-Thread对比—任务调度

    在任务调度器的实现上,μC/OS-II和RT-Thread都采用了位图调度(bitmap scheduling),任务优先级的值越小则代表具有越高的优先级,主要区别在于实现形式,是采用多级队列的形式, ...

  4. 基于Html5的移动端APP开发框架

    快速增长的APP应用软件市场,以及智能手机的普及,手机应用:Native(原生)APP快速占领了APP市场,成为了APP开发的主流,但其平台的不通用性,开发成本高,多版本开发等问题,一直困扰着专业AP ...

  5. POJ1195(二维树状数组)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 17176   Accepted: 7920 De ...

  6. 演讲:对 2000 多亿条数据做一次 group by 需要多久?

    http://2017.qconbeijing.com/presentation/646?utm_source=weibo&utm_medium=infoq&utm_campaign= ...

  7. SpringBoot之导入导出Excel

    1.添加springBoot支持 <dependency> <groupId>org.apache.poi</groupId> <artifactId> ...

  8. oracle针对中文排序

    在oracle 9i之前,对中文的排序,是默认按2进制编码来进行排序的. 9i时增加了几种新的选择: 按中文拼音进行排序:SCHINESE_PINYIN_M 按中文部首进行排序:SCHINESE_RA ...

  9. [hiho1586]Minimum

    题意:区间内乘积最小值,带修改.解题关键:线段树裸题,考场上以为x y必须不等,还维护了次小值,尼玛嗨尼玛嗨,划水一整场,心态爆炸. 注意坐标需要+1 #include<cstdio> # ...

  10. 关于JSP页面中的pageEncoding和contentType两种属性的区别

    转自:http://blog.csdn.net/dragon4s/article/details/6604624 JSP指令标签中<%@ page contentType="text/ ...