题干:

Description
称一个1,2,…,N的排列P1,P2…,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2.

计算1,2,…N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值
Input
输入文件的第一行包含两个整数 n和p,含义如上所述。
Output
输出文件中仅包含一个整数,表示计算1,2,⋯, n的排列中, Magic排列的个数模 p的值。
Sample Input
20 23
Sample Output
16
HINT
100%的数据中,1 ≤ N ≤ 106, P≤ 10^9,p是一个质数。

题目概述:求N个数的排列中满足P[i]>P[i/2]的个数。


题解:

拿到这道题一脸懵比,自己想了半天妄图用纯组合数学知识做出来。

问了问大佬,大佬说要用小根堆,吓得我直接就不是人了。

研究了一下,发现这道题其实就是求n个数组成的小根堆的个数。

写出来一个状态转移方程(搞得跟树归似的吓死个人):f[i]=f[i<<1]+f[i<<1|1]+C(size[i-1],size[i<<1]);

解释一下:上式中,size代表小根堆(其实就是一个树型的)以某一点为根节点的子树的大小。

f代表以当前节点为根节点的小根堆共有多少中排列方式。

$C_{size[i-1]}^{size[i<<1]}$代表的意义是:从比i大的数字中选出左儿子需要的个数插入到左子树中组成的一种排列。

其实$C_{size[i-1]}^{size[i<<1]}$和$C_{size[i-1]}^{size[i<<1|1]}$还是一样的。

size的累加过程:siz[i]=siz[i<<1]+siz[i<<1|1]+1;

我们发现,n的范围还是不小的(10的6次方),所以用到了Lucas定理。就这样啦~

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdlib>
using namespace std;
long long n,p,siz[4000006],dp[4000006];
long long fac[40000006];
inline long long qpow(long long a,long long b)
{register long long ans=1;a%=p;while(b){if(b&1)ans=ans*a%p;a=a*a%p;b>>=1;}return ans;
}
inline long long C(long long nn,long long k)
{if(k>nn)return 0;elsereturn fac[nn]*(qpow(fac[k]*fac[nn-k]%p,p-2))%p;
}
inline long long Lucas(long long a,long long b)
{if(b==0)return 1;return C(a%p,b%p)*Lucas(a/p,b/p)%p;
}
inline void getchart()
{fac[1]=fac[0]=1;for(register long long i=2;i<=n;i++)fac[i]=(fac[i-1]*i)%p;return ;
}
int main()
{scanf("%lld %lld",&n,&p);getchart();
//    cout<<fac[10]<<endl;for(register int i=n;i>=1;--i){siz[i]=siz[i<<1]+siz[i<<1|1]+1;dp[i]=Lucas(siz[i]-1,siz[i<<1]);if((i<<1)<=n)dp[i]=(dp[i]*dp[i<<1])%p;if((i<<1|1)<=n)dp[i]=(dp[i]*dp[i<<1|1])%p;}printf("%lld\n",dp[1]);return 0;
}

代码在这里

转载于:https://www.cnblogs.com/xingmi-weiyouni/p/11131530.html

「题解」:[组合数学]:Perm 排列计数相关推荐

  1. 「题解」清华集训 2016 你的生命已如风中残烛

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书: 题目 题目链接:洛谷 P6672.UOJ 273. 题意简述 给你牌数为 m + 1 m+1 m+1 的牌堆,其中第 m + 1 m+1 ...

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

  3. 「题解」蝙蝠侠的麻烦

    没 事 找 事 「我的做题历程」: step1:观察题面.   「蝙蝠侠需要找到一个最长的字符串,使得这个字符串作为一个子序列被包含在所有的三个字符串中」,可以得出这是一道最长公共子序列,而且有三个字 ...

  4. 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理

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

  5. 「题解」:[BZOJ4558]方

    问题: 方 时间限制: 2 Sec  内存限制: 256 MB 题面 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一 ...

  6. [BZOJ 2111][ZJOI2010]Perm 排列计数(Lucas定理)

    Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...

  7. 「题解」300iq Contest 2 B Bitwise Xor

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:gym102331B. 题意概述 给你一个长度为 nnn 的序列 aia_iai​,求一个最长的子序列满足所有子序列中的元 ...

  8. 「题解」:[线段树]:永无乡

    题面 题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 ...

  9. 「题解」USACO15FEB Fencing the Herd G

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书: 题目 题目链接:洛谷 P3122.USACO 官网. 题意概述 给你平面上的一些点和直线,有两种操作: 新加入一个点 (x,y)(x,y) ...

最新文章

  1. 数据分析师的基本素质
  2. 图灵三周年盛大庆典!
  3. [转]新版.Net开发必备十大工具
  4. 卷积神经网络迁移学习
  5. swiftui 跳转_酷!苹果推出 SwiftUI,提高编程效率
  6. pandas 中文打印无法对齐_2天学会Pandas
  7. 因为链接服务器 IP 的 OLE DB 访问接口 SQLNCLI 无法启动分布式事务
  8. handler更新ui线程的基本用法
  9. PHP正则表达式的快速学习方法
  10. 【LwM2M】LwM2M相关的开源项目
  11. View系列:事件分发:滑动触摸事件分发
  12. 计算机论文注释范例,论文的注释怎么加(范例解读)
  13. aspnet mvc 中 跨域请求的处理方法
  14. matlab出现问题:TRANSPOSE 不支持 N 维数组。请使用 PAGETRANSPOSE/PAGECTRANSPOSE 转置页,或使用 PERMUTE 重新排列 N 维数组的维度。
  15. ios修改apn的插件_更改接入点,瞬间让你在4G网络下快到不行!效果立竿见影!...
  16. RASP | 远程Java应用的RASP调试教程
  17. python opengl书籍_初试PyOpenGL一 (Python+OpenGL)
  18. JVAV SE学习总结(01)
  19. oracle付款汇兑损益怎么产生,汇兑损益如何进行账务处理?
  20. nltk学习之统计词频和分词nltk.word_tokenize nltk.FreqDist

热门文章

  1. JavaScript(JS)的习惯写法总结
  2. MacOS使用brew无法安装Python_无法安装gdbm_无法安装autojump
  3. Java 中把声明变量的语句如果写在循环体内,每次执行时栈内存中的变量和数据是如何变化的?
  4. Apache的架构师总结出30条架构设计原则
  5. 在linux上安装mysql5.6,在linux(Centos 7以上版本亲测)上安装mysql5.6
  6. 大学计算机系学生,大学计算机专业学生自我介绍
  7. 深度学习pytorch--softmax回归(二)
  8. 模块pdf2image.dll加载失败_Webpack 原理从前端模块化开始
  9. linux 4.1.16 ftrace 进程调度,Linux内核进程调度overview(1)
  10. python打开软件输入消息_用Python编写一个私人助理程序,为我们起草电子邮件!...