题目大意

  求满足下列条件的排列$P$的数量:$\forall P_i, P_i>P_{\lfloor \frac{i}{2}\rfloor}$。

思路

从下标入手

  反过来想,也就是对$\forall P_i, P_i<P_{2i}且P_i<P_{2i+1}$。因为小根堆中一个“小三角”中节点的编号满足:若顶部编号为$i$,则左下角节点编号为"2i",右下角为$2i+1$,因此题目就是要让我们求大小为$n$的小根堆的数量。

递归式

  因为堆这个结构有“子堆”这个子结构,所以可以递归。定义$l(n)$为大小为$n$的堆的左子堆大小,$f(i)$为大小为$i$,所有节点的值的取值范围一定(但并没有具体指定)时都不相等的堆有多少个。该堆的左子堆的个数等于当左子堆所有节点的值的取值范围的种数($C_{n-1}^{l(n)}$)乘以当所有节点的值的取值范围一定时的堆数($f(l(n))$)。分析完左子堆,随后还要乘以右子堆的堆数($f(r(n))$)。由于左子堆取值范围的种数确定了,右子堆的也确定了,所以不用再次乘以$C_{n-1}^{r(n)}$了。故总递归式为:

$$f(n)=C_{n-1}^{l(n)}f(l(n))f(r(n))$$

  注意求组合数时要用Lucas定理取模。

怎么求$l(n),r(n)$?

  注意这个没有通项公式,要按照堆的顺序递归解决。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define ll long long
const int MAX_N = 1000010;
ll F[MAX_N], Fact[MAX_N];
int Size_Lsize[MAX_N], Size_Rsize[MAX_N]; int GetSize(int curNode, int n)
{
if (curNode > n)
return 0;
int lSize = GetSize(curNode * 2, n), rSize = GetSize(curNode * 2 + 1, n), curSize = lSize + rSize + 1;
Size_Lsize[curSize] = lSize, Size_Rsize[curSize] = rSize;
return curSize;
} void GetFact(int n, int p)
{
Fact[0] = Fact[1] = 1;
for (ll i = 2; i <= n; i++)
Fact[i] = i * Fact[i - 1] % p;
} ll Mult(ll a, ll b, ll p)
{
ll ans = 0;
while (b)
{
if (b & 1)
ans = (ans + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ans;
} ll Power(ll a, ll n, ll p)
{
ll ans = 1;
while (n)
{
if (n & 1)
ans = Mult(ans, a, p);
a = Mult(a, a, p);
n >>= 1;
}
return ans;
} ll Inv(ll a, ll p)
{
return Power(a, p - 2, p);
} ll Comb(int n, int m, int p)
{
return Fact[n] * Inv(Mult(Fact[n - m], Fact[m], p), p);
} ll Lucas(int n, int m, int p)
{
if (m == 0)
return 1;
return Comb(n % p, m % p, p) * Lucas(n / p, m / p, p) % p;
} ll Dfs(int n, int p)
{
if (F[n])
return F[n];
if (n == 1 || n == 0)
return F[n] = 1;
return F[n] = Dfs(Size_Lsize[n], p) * Dfs(Size_Rsize[n], p) % p * Lucas(n - 1, Size_Lsize[n], p) % p;//易忘点:Dfs后的%p
} int main()
{
int n;
ll p;
scanf("%d%lld", &n, &p);
GetSize(1, n);
GetFact(n, p);
printf("%lld\n", Dfs(n, p));
return 0;
}

  

luogu2606 排列计数的更多相关文章

  1. BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status ...

  2. bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)

    题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 846  Solved: 530[Submit][ ...

  3. ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)

    这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...

  4. 数学(错排):BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status ...

  5. 【数论·错位排列】bzoj4517 排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1428  Solved: 872[Submit][Statu ...

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

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

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

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

  8. bzoj4517排列计数 错排+组合

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1491  Solved: 903[Submit][Statu ...

  9. BZOJ_4517_[Sdoi2016]排列计数_组合数学

    BZOJ_4517_[Sdoi2016]排列计数_组合数学 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[ ...

随机推荐

  1. 《CSS Mastery》读书笔记(4)

    第七章 布局   CSS得到一个不好的名声,比较难懂, 一方面由于浏览器的不兼容,另一方面由于网上大量的技巧,每个CSS作者都可以有自己的方法去创建多列布局, 新的CSS开发者只是使用一种方法而不去理 ...

  2. ES6 Template String 模板字符串

    模板字符串(Template String)是增强版的字符串,用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量. 大家可以先看下面一段代码: $(&quo ...

  3. AI:狄拉克之海上的涟漪

    延陵季子2011年  8月27日 19:02   借鉴英文原文:Ripples in the Dirac Sea 当他试着用一种轻松的口吻诉说一些事情时,我会明白,其实我们都明白,在他的心里绝对不是平 ...

  4. 图像连通域检测的2路算法Code

    本文算法描述参考链接:http://blog.csdn.net/icvpr/article/details/10259577 两遍扫描法: (1)第一次扫描: 访问当前像素B(x,y),如果B(x,y ...

  5. raspberry pi树莓派设置

    买了个pi3b 安装系统 需要class10 TF卡.读卡器 下载系统并解压Raspbianhttps://www.raspberrypi.org/downloads/raspbian/访问慢的话请用 ...

  6. 【转载】浏览器缓存详解:expires cache-control last-modified

    https://www.cnblogs.com/caiyanhu/p/6931624.html 下面的内容展示了一个常见的 Response Headers,这些 Headers 要求客户端最多缓存 ...

  7. js 立即调用函数

    function makeCounter() { //不能立即执行 // 只能在makeCounter内部访问i var i = 0; return function () { console.log ...

  8. javaee IO流作业

    package Zy; import java.io.Serializable; public class Student implements Serializable{ private stati ...

  9. swift UITableViewCell 中的单选控制样式

    我昨天在网上找了一晚上的资料,但是大多都是OC得语法,swift资料实在是太少了,使得我这个刚入门swift的彩笔好不吃力,后面一直各种翻阅资料,终于让我找到了 visibleCells 这个方法,直 ...

  10. [luogu2825 HEOI2016/TJOI2016] 游戏 (二分图最大匹配)

    传送门 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了 ...