原题链接:https://www.luogu.org/problemnew/show/P2606

排列计数

题目描述

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

输入输出格式
输入格式:

输入文件的第一行包含两个整数 n和p,含义如上所述。

输出格式:

输出文件中仅包含一个整数,表示计算1,2,⋯, ���的排列中, Magic排列的个数模 p的值。

输入输出样例
输入样例#1:

20 23

输出样例#1:

16

说明

100%的数据中,1 ≤N ≤ 10^6, P≤ 10^9,p是一个质数。

题解

条件是Pi&gt;Pi/2P_i&gt;P_{i/2}Pi​>Pi/2​,反过来看就是Pi&lt;Pi&lt;&lt;1,Pi&lt;Pi&lt;&lt;1∣1P_i&lt;P_{i&lt;&lt;1},P_i&lt;P_{i&lt;&lt;1|1}Pi​<Pi<<1​,Pi​<Pi<<1∣1​,唉这不是个满二叉小根堆吗。

那么问题就变成了点数为nnn的满二叉小根堆的计数问题,dp[i]dp[i]dp[i]表示以PiP_iPi​为根的满二叉小根堆的个数,有转移方程如下:
dp[i]=(siz[i]−1siz[i&lt;&lt;1])×dp[i&lt;&lt;1]×dp[i&lt;&lt;1∣1]dp[i]=\binom{siz[i]-1}{siz[i&lt;&lt;1]}\times dp[i&lt;&lt;1]\times dp[i&lt;&lt;1|1]dp[i]=(siz[i<<1]siz[i]−1​)×dp[i<<1]×dp[i<<1∣1]

sizsizsiz数组的话在dpdpdp时顺带维护一下即可。

由于模数不确定,且一定为质数,所以我们使用Lucas\mathcal{Lucas}Lucas定理:
(nm)≡(⌊np⌋⌊mp⌋)×(nmod&ThinSpace;&ThinSpace;pmmod&ThinSpace;&ThinSpace;p)mod&ThinSpace;&ThinSpace;p\binom{n}{m}\equiv\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{m}{p}\rfloor}\times \binom{n\mod p}{m\mod p}\mod p(mn​)≡(⌊pm​⌋⌊pn​⌋​)×(mmodpnmodp​)modp

代码
#include<bits/stdc++.h>
#define ll long long
#define ls (i<<1)
#define rs (ls|1)
using namespace std;
const int M=1e6+5;
int siz[M],n,mod,mx;
ll fac[M],inv[M],dp[M];
ll power(ll x,ll p){ll r=1;for(;p;p>>=1,x=x*x%mod)if(p&1)r=r*x%mod;return r;}
ll C(int n,int m)
{if(m>n)return 0;if(n<mod&&m<mod)return fac[n]*inv[n-m]%mod*inv[m]%mod;return C(n/mod,m/mod)*C(n%mod,m%mod)%mod;
}
void in(){scanf("%d%d",&n,&mod);}
void ac()
{mx=min(mod-1,n);fac[0]=1;for(int i=1;i<=mx;++i)fac[i]=fac[i-1]*i%mod;inv[mx]=power(fac[mx],mod-2);for(int i=mx-1;i>=0;--i)inv[i]=(i+1)*inv[i+1]%mod;for(int i=n;i;--i){siz[i]=1;if(ls<=n)siz[i]+=siz[ls];if(rs<=n)siz[i]+=siz[rs];if(rs<=n)dp[i]=C(siz[i]-1,siz[ls])*dp[ls]%mod*dp[rs]%mod;else if(ls<=n)dp[i]=dp[ls];else dp[i]=1;}printf("%lld",dp[1]);
}
int main()
{in(),ac();
}

Luogu2606[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. 一文带你看懂Spring事务!
  2. Linux下常用的压缩与解压命令
  3. HDU-2159 FATE 二维背包
  4. Kebernetes 学习总结(9)认证-授权-RBAC
  5. WebApi网关之Bumblebee和Ocelot性能对比
  6. WebAssembly 技术汇总
  7. 索引-前端技术-pyhui版
  8. LeetCode题 - 1 两数之和
  9. 华为第二批“十大军团”正式成立!
  10. 为什么基类的析构函数是虚函数?
  11. Debian中proftpd+mysql+虚拟用户+匿名用户+磁盘限额的配置
  12. BACKPROPAGATION 手工求解
  13. java.lang.NoClassDefFoundError: org/jaxen/JaxenException
  14. JS数值类型与字符串类型的内置方法
  15. 计算机快捷键word,电脑中怎样自定义Word2010快捷键【图文教程】
  16. ps 图片添加文字
  17. fedora下载中的kde、xfce、workstation区别
  18. 算法练习(7) —— 动态规划 Strange Printer
  19. Word的样式库在 选项卡中_Word|表格的设置
  20. 【大数据/分布式】MapReduce学习-结合6.824课程

热门文章

  1. 牛顿插值 | MATLAB源码
  2. mac储存文件应该放在哪里_单位不能存档,个人档案应该放在哪里呢,影响今后退休金吗?...
  3. ref:LDAP入门
  4. UVa 10129 - Play on Words (欧拉回路, DFS)
  5. linux DHCP安装和测试
  6. memcached在项目中的应用
  7. 【转】JMeter Tutorial的安装和具体操作
  8. Java基础知识强化之集合框架笔记15:List集合的特点
  9. c++ 接口继承和实现继承
  10. 云计算相关的一些概念Baas、Saas、Iaas、Paas