题目描述

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

输入格式

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

输出格式

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

样例

样例输入

20 23

样例输出

16

数据范围与提示

100%的数据中,1 ≤ ??? N ≤ 106, P??? ≤ 10^9,p是一个质数。 数据有所加强

刚刚学了组合数学,然后就水了道题。

模板一定要好好学,一个取模颓老半天。。。。。

然后开始说正经的

首先这题仔细想想可以看成二叉堆(满足大小关系嘛。。。)

然后就可以像个树规似的

从最下的节点看是向上转移

设f数组表示方案数size数组表示子树大小

因为每个节点的左子树的方案树与右子树方案数相乘并没有枚举出全部结果

仔细想想每个节点的左右子树的数是可以互换的这样依旧满足二叉堆性质

即 C(size[i]-1,size[left])可表示

然后数据范围可以用卢卡斯定理取模

这就不解释了反正网上很多。。。。

C(n,m)%p=C(n%p,m%p)*C(n/p,m/p)%p

总之最后转移的式子

f[x]=f[x*2]*f[x*2+1]*C(size[x]-1,size[x*2])

蒟蒻第一次写博客如有不当请指正

 1 #include<cstdio>
2 #include<iostream>
3 #include<cmath>
4 #include<algorithm>
5 #include<cstring>
6 #define MAXN 2006001
7 #define ll long long
8 using namespace std;
9 ll sum[MAXN];
10 ll size[MAXN],f[MAXN];
11 ll n,p;
12 ll pow(ll x,ll y)
13 {
14 ll ans=1;
15 while(y>0)
16 {
17 if(y&1)ans=ans*x%p;
18 x=x*x%p;
19 y>>=1;
20 }
21 return ans%p;
22 }
23 ll getsum(ll x,ll y)
24 {
25 if(y>x) return 0;
26 if(!y)return 1;
27 return (sum[x]*pow(sum[y]*sum[x-y]%p,p-2)%p)%p;
28 }
29 ll lucas(ll x,ll y)
30 {
31 if(y>x)return 0;
32 if(y==0)return 1;
33 if(x>p||y>p)return lucas(x/p,y/p)*getsum(x%p,y%p)%p;
34 return getsum(x,y)%p;
35 }
36 void find(ll k)
37 {
38 if(k>n){f[k]=1;return ;}
39 find(k*2);find(k*2+1);
40 size[k]=size[k*2]+size[k*2+1]+1;
41 f[k]=f[k*2]*f[k*2+1]%p*lucas(size[k]-1,size[k*2])%p;
42 }
43 int main()
44 {
45 scanf("%lld%lld",&n,&p);
46 sum[0]=1;sum[1]=1;
47 for(ll i=2;i<=n;++i)sum[i]=((sum[i-1]*1ll*i)%p);
48 find(1);
49 printf("%lld\n",f[1]%p);
50 }

View Code

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

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

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

  2. 2111: [ZJOI2010]Perm 排列计数

    2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...

  3. bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

    bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...

  4. 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数

    [BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...

  5. Perm排列计数(新博客试水,写的不好,各路大神见谅)

    B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出   题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i&l ...

  6. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

  7. BZOJ2111: [ZJOI2010]Perm 排列计数

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2< ...

  8. bzoj2111 Perm 排列计数

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

  9. [ZJOI 2010]Perm 排列计数

    Description 题库链接 询问有多少个 \(1\sim N\) 的排列 \(P\) 满足" \(\forall i\in[2,N], P_i>P_{\frac{i}{2}}\) ...

  10. bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i ...

随机推荐

  1. mysql 的查询操作语句---自动生成各种不同的序号

    1.通过查询语句添加自动生成序号 SELECT m.id,(@a :=@a + 1) AS a FROM 表名 m, (SELECT @a := 0) t1 2.MySQL字符串前后补0 前补0(LP ...

  2. SQL必知必会 —— 性能优化篇

    数据库调优概述 数据库中的存储结构是怎样的 在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载.也就是说,数据库管理存储空间的基本单位是页(Page). 一个页中可以存储多个行记录(Ro ...

  3. web&HTML

    内容索引 1. web概念概述 2. HTML web概念概述 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务 ...

  4. 有关80386cpu在保护模式下的虚拟地址,线性地址和实际物理地址的关系

    80386cpu是8086cpu的升级版,其具有32位的寄存器.(32根地址线和32根数据线) 8086cpu其是16位的寄存器但是其地址线有20根,其寻址范围为2的20次方,但是有一个16位的寄存器 ...

  5. Codeforces Round #691 (Div. 2)

    A. Red-Blue Shuffle 题意:有两个长度为n的数组,数组a和数组b,问那个数组中的数字相比之下比另一个数组中相应位置的元素值更大一些,如果数组a大就输出RED,如果数组b大就输出BLU ...

  6. mysql不停库恢复

    环境搭建:yum -y install mysql-co*servervim /etc/my.cnf############server-id=1log-bin=binbinlog-format=RO ...

  7. RHEL/CentOS 7 中配置 PXE 网络启动服务器

    RHEL/CentOS 7 中配置 PXE 网络启动服务器 作者: Matei Cezar 译者: LCTT joeren | 2015-02-17 14:28   评论: 13 收藏: 8 分享:  ...

  8. SPI总线 通俗易懂讲解——(转载)

    SPI总线 MOTOROLA公司的SPI总线的基本信号线为3根传输线,即SI.SO.SCK.传输的速率由时钟信号SCK决定,SI为数据输入.SO为数据输出.采用SPI总线的系统如图8-27所示,它包含 ...

  9. ubuntu中安装meld工具-(转自sukhoi27smk)

    Ubuntu下文件/目录对比的软件Meld可能有很多用户还不是很熟悉,下文就给大家介绍如何安装Meld和移植到Gedit下.具体内容如下所述. Meld允许用户查看文件.目录间的变化.很容易移植到Ge ...

  10. centos7 的Linux下ip命令替换ifconfig命令的用法

    linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...