题目

坐标\(/2\)这种神奇的性质肯定在暗示什么

基本是完全二叉树了

又发现\(P_{i}<P_{i/2}\),于是发现这是一棵小根堆

题意变成了求满足条件的小根堆有多少个

考虑一个树形\(dp\)

设\(dp_{i}\)表示\(i\)为根的小根堆有几种,\(sz_{i}\)表示这个小根堆的大小,假设当前小根堆就表示\(1\)到\(sz[i]\)这些数

那么\(i\)这个节点肯定要填上\(1\)

剩下的节点来自左右子树,我们分配一下,就是

\[dp_{ls}\times dp_{rs}\times \binom{sz_i-1}{sz_{ls}}\]

就是先给左子树找好位置,之后剩下的插空填上就好了

可能需要用\(Lucas\)

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define re register
#define maxn 1000005
inline int read() {int x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n;LL mod;
LL fac[maxn],inv[maxn],dp[maxn];
int sz[maxn];
inline LL C(int n,int m) {if(m>n) return 0;return fac[n]*inv[n-m]%mod*inv[m]%mod;}
inline LL ksm(LL a,int b) {LL S=1;while(b) {if(b&1) S=S*a%mod;b>>=1;a=a*a%mod;}return S;}
namespace sub1 {inline void solve() {fac[0]=1;for(re int i=1;i<=n;i++) fac[i]=(fac[i-1]*(LL)i)%mod;inv[n]=ksm(fac[n],mod-2);for(re int i=n-1;i>=0;--i) inv[i]=(inv[i+1]*(LL)(i+1))%mod;for(re int i=1;i<=n;i++) sz[i]=1;for(re int i=1;i<=n+1;i++) dp[i]=1;for(re int i=n;i>=1;--i) {sz[i>>1]+=sz[i];if(sz[i]==1) continue;dp[i]=C(sz[i<<1]+sz[i<<1|1],sz[i<<1])*dp[i<<1|1]%mod*dp[i<<1]%mod;}printf("%lld\n",dp[1]);}
}
namespace sub2 {inline LL Lucas(int n,int m) {if(n<mod||m<mod) return C(n,m);return Lucas(n/mod,m/mod)*C(n%mod,m%mod)%mod;}inline void solve() {fac[0]=1;for(re int i=1;i<mod;i++) fac[i]=(fac[i-1]*(LL)i)%mod;inv[mod-1]=ksm(fac[mod-1],mod-2);for(re int i=mod-2;i>=0;--i) inv[i]=(inv[i+1]*(LL)(i+1))%mod;for(re int i=1;i<=n;i++) sz[i]=1;for(re int i=1;i<=n+1;i++) dp[i]=1;for(re int i=n;i>=1;--i) {sz[i>>1]+=sz[i];if(sz[i]==1) continue;dp[i]=Lucas(sz[i<<1]+sz[i<<1|1],sz[i<<1])*dp[i<<1|1]%mod*dp[i<<1]%mod;}printf("%lld\n",dp[1]);}}
int main() {n=read(),mod=read();if(mod>n) sub1::solve();else sub2::solve();return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10483335.html

[ZJOI2010]排列计数相关推荐

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

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

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

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

  3. Zjoi2010排列计数Perm

    这东西还是挺有思想的,道听途说一些东西,问问DuanYue同志,然后自己打表画树推了推,就搞出来了. 首先根据p i>p i/2(向下取整)这种形式,如果线段树学的好的人,一定能看出来,这是在唯 ...

  4. [ZJOI2010] 排列计数(dp + 组合数)

    problem luogu-P2606 solution 我们对 i−⌊i2⌋i-\lfloor\frac i2\rfloori−⌊2i​⌋ 远没有 i−2∗i,2∗i+1i-2*i,2*i+1i−2 ...

  5. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

  6. bzoj 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 637  Solved: 396 [Submit][Stat ...

  7. 数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农

    丝且人一口 Virus Tree 2 description solution code RGB Coloring description solution code 123 Triangle des ...

  8. [2019 牛客CSP-S提高组赛前集训营4题解] 复读数组(数论)+ 路径计数机(数上DP)+ 排列计数机(线段树+二项式定理)

    文章目录 T1:复读数组 题目 题解 代码实现 T2:路径计数机 题目 题解 代码实现 T3:排列计数机 题目 题解 CODE T1:复读数组 题目 有一个长为n×k的数组,它是由长为n的数组A1,A ...

  9. bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1259  Solved: 766 [Submit][Sta ...

  10. 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 ...

最新文章

  1. Haskell 差点儿无痛苦上手指南
  2. AOP:【动态代理】||@Pointcut
  3. 【分割模型解读】感受野与分辨率的控制术—空洞卷积
  4. HTML中a标签/超链接标签的下划线怎么去掉
  5. php phpass,ass.php · ciweiin/海洋cms 海洋影视管理系统 - 免费开源PHP - Gitee.com
  6. 8种常见SQL错误用法,你犯过几个?
  7. thumbnailator 一个好用的图像处理工具集
  8. 如何从字典中随机选择一个键
  9. 操作系统概念(Operating System Concepts Ninth Edition恐龙书)阅读
  10. Steam的Hacknet的账户损坏问题
  11. php 0 加减乘除,php 加减乘除计算器 用php简单实现加减乘除计算器
  12. Mac技巧 — QuickTime Player 设置播放速度
  13. 用户行为监控(Piwik)
  14. 数据恢复工具winhex教程
  15. Autodesk 专用安装检查和卸载程序
  16. hdu3265(好题翻译)
  17. 微服务 ZooKeeper ,Dubbo ,Kafka 介绍应用
  18. JAVA 删除File文件中的内容。
  19. 什么是好代码-代码整洁之道阅读笔记
  20. 自适应巡航控制系统——ACC

热门文章

  1. 程序员,都是内卷之王!
  2. 程序员必看—程序员如何高效提升自己?
  3. Java开发者还用SSH?大清朝都亡了,你知道吗?
  4. 搞定 Linux Shell 文本处理工具,看完这篇集锦就够了
  5. 如果生个儿子,一定得教他打篮球。
  6. 2017 上半年总结
  7. Linux进阶之使用Oh-My-Zsh打造炫酷终端
  8. [原创]IPV4分组的格式
  9. 自己写的微信小程序炸金花简单版
  10. python核心编程笔记--chapter2