Perm 排列计数
题目描述
称一个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 排列计数的更多相关文章
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- 2111: [ZJOI2010]Perm 排列计数
2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
- Perm排列计数(新博客试水,写的不好,各路大神见谅)
B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i&l ...
- 【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是素数 ...
- BZOJ2111: [ZJOI2010]Perm 排列计数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2< ...
- bzoj2111 Perm 排列计数
称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输 ...
- [ZJOI 2010]Perm 排列计数
Description 题库链接 询问有多少个 \(1\sim N\) 的排列 \(P\) 满足" \(\forall i\in[2,N], P_i>P_{\frac{i}{2}}\) ...
- bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i ...
随机推荐
- 一个入门级CTF的Reverse
这道题是XCTF攻防世界上的一道新手入门题目! 年前刚接触逆向时IDA,OD了这些工具都不会用(负基础),当时做这些题的时候觉得挺难(主要是缺少练习,没思路无从下手).现在回头再来看这些题目感觉确实是 ...
- 敏杰开题——软工团队项目选择与NABCD分析
这是一篇软件工程课程博客 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目选择 我们在这个课程的目标是 团队协作实践敏捷开发 这个作业在哪个具 ...
- JavaScript中的运算符和语句
一.JavaScript的运算符 a.基本的算术运算符(+.-.*./.%) -.*./.%运算符会在必要的时候将操作数转换为数字,无法转换成数字的操作数将会转换成NaN,相应的运算结果也是NaN. ...
- ELK学习实验017:filebeat收集java日志
收集JAVA格式日志 1 查看Java格式日志 elasticsearch属于Java日志,可以收集elasticsearch作为Java日志范本 [root@node3 ~]# tail -f /u ...
- JavaEE 前后端分离以及优缺点
前端概念 前端是一切直接与用户交互的页面或软件(用户看得见.摸得着)的统称,比如各种网站网页.andorid 手机各种 App.苹果手机各种 app.微信小程序.网络游戏客户端等.所以,普通人使用计算 ...
- C语言函数sscanf()的用法-(转自Walter L)
在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int ss ...
- 安装了Python2.X和Python3.X后Python2.X IDLE打不开解决办法总结
安装了Python2.X和Python3.X后Python2.X IDLE打不开,两个版本都卸载后重装仍然打不开,在网上找了几种办法,希望对大家能有所帮助 1.首先查看环境变量是否配置正确 配置方法网 ...
- 原型和原型链 prototype和proto的区别
原型 原型是function对象下的属性,它定义了构造函数的共同祖先,也就是一个父子级的关系,子对象会继承父对象的方法和属性 prototype是函数下的属性,对象想要查看原型使用隐式属性__Prot ...
- Navigation activity回退到fragment失败
我有一个activity--MainActivity, 布局中设置了一个 <androidx.fragment.app.FragmentContainerView android:layout_ ...
- oepncv实现——图像去水印
功能简介:通过拖动鼠标实现指定区域水印或是斑点的去除. 实现原理:利用opencv鼠标操作setMouseCallback函数框选(左上到右下)需要处理的区域,按下鼠标开始选中,松开鼠标结束,对选中区 ...