题目描述

称一个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. (转)通过gitlab统计git提交的代码量

    git的代码量大多数都是根据命令行统计,或者根据第三方插件统计.但是都不满足我的需求,因为我们代码都由gitlab管理,于是想到了通过gitlab暴露出来的接口获取数据. 第一步,生成私钥 登录你的g ...

  2. [知识路书]beta设计和计划

    [知识路书]beta设计和计划 一.需求再分析 根据用户反馈,是否发现之前的需求分析有偏差?为什么会出现这种偏差?beta阶段你们是否能真的分析清楚用户需求?如何做到? 根据alpha阶段的推广情况以 ...

  3. 2021年有哪些优秀的免费PSD样机素材下载的网站?

    2021年有哪些优秀的免费PSD样机素材下载的网站? 无论是ui设计师还是平面设计师,为避免无休止的加班,平时就需要寻找并收藏一些优秀的设计素材网站.好的素材可以帮助设计师设计作品起到事半功倍的效果, ...

  4. [Linux] 删除find到的目录

    参考 https://www.centos.bz/2017/09/linux%E7%B3%BB%E7%BB%9F%E4%B8%8Bfind%E5%91%BD%E4%BB%A4%E9%80%92%E5% ...

  5. Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式最占cpu的进程

    Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式 2016/12/220 Comments  ######### ps -eo pid,ppid,%mem,%cpu,cmd ...

  6. Debian 9.4 多网卡链路聚合bond配置

    Debian 9.4 多网卡链路聚合bond配置 安装ifenslave ifenslave 的作用是网卡的负载均衡 root@debian:~# apt-get install ifenslave ...

  7. 013.Kubernetes认证授权

    一 Kubernetes认证系统介绍 1.1 访问控制 Kubernetes API的每个请求都会经过多阶段的访问控制之后才会被接受,这包括认证.授权以及准入控制(Admission Control) ...

  8. 串口配合DMA接收不定长数据(空闲中断+DMA接收)-(转载)

    1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间  认为桢收完,总线空闲中断是在检测到在接收数据后, ...

  9. MyBatis 项目开发中是基于 XML 还是注解?

    只要你对 MyBatis 有所认识和了解,想必知道 MyBatis 有两种 SQL 语句映射模式,一种是基于注解,一种是基于XML. 基于 XML <mapper namespace=" ...

  10. MyBatis 高级查询之一对多查询(十)

    高级查询之一对多查询 查询条件:根据游戏名称,查询游戏账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据游戏名查询游戏账号 * @param ...