[ZJOI 2010]Perm 排列计数
Description
询问有多少个 \(1\sim N\) 的排列 \(P\) 满足“ \(\forall i\in[2,N], P_i>P_{\frac{i}{2}}\) ” 。对质数 \(P\) 取模。
\(1\leq N\leq 1000000,1\leq P\leq 10^9\)
Solution
容易发现满足题目需要的性质的序列就是满足堆性质的。那么可以在树(堆)上 \(DP\) 。
记 \(f_o\) 为在 \(o\) 节点及其子树中满足条件的编号方法数。
显然 \[f_o=f_{2o}f_{2o+1}C_{size_{2o}+size_{2o+1}}^{size_{2o}}\]
注意由于 \(p\) 不一定大于 \(n\) ,所以不能直接求逆。
Code
//It is made by Awson on 2018.3.22
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 1e6;
void read(int &x) {
char ch; bool flag = 0;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
x *= 1-2*flag;
}
void print(int x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(int x) {if (x < 0) putchar('-'); print(Abs(x)); }
int n, p, a[N+5], b[N+5], f[N+5], size[N+5], num[N+5];
int C(int n, int m) {
if (num[n]-num[n-m]-num[m] == 0) return 1ll*a[n]*b[n-m]%p*b[m]%p;
return 0;
}
int dfs(int o) {
if (o*2 > n) {f[o] = 1; return size[o] = 1; }
if (o*2+1 > n) {size[o] = dfs(o*2)+1; f[o] = f[o*2]; return size[o]; }
size[o] = 1+dfs(o*2)+dfs(o*2+1);
f[o] = 1ll*f[o*2]*f[o*2+1]%p*C(size[o*2]+size[o*2+1], size[o*2+1])%p;
return size[o];
}
void work() {
read(n); read(p);
a[0] = b[0] = a[1] = b[1] = 1;
for (int i = 2; i <= n; i++) {
if (i%p) b[i] = -1ll*(p/i)*b[p%i]%p;
else b[i] = 1;
}
for (int i = 2; i <= n; i++) {
b[i] = 1ll*b[i]*b[i-1]%p;
if (i%p) a[i] = 1ll*a[i-1]*i%p;
else a[i] = a[i-1];
}
for (int i = 2; i <= n; i++) {
num[i] = num[i-1];
if (i%p == 0) {
int x = i;
while (x%p == 0) ++num[i], x /= p;
}
}
dfs(1); writeln((f[1]+p)%p);
}
int main() {work(); return 0; }
[ZJOI 2010]Perm 排列计数的更多相关文章
- 「ZJOI 2010」 排列计数
题目链接 戳我 \(Solution\) 其实我们可以发现这题等价于让你求: 用\(1\)~\(n\)的数组成一个完全二叉树使之满足小根堆性质的方案数 于是我们可以考虑\(dp\) 假设我们现在在\( ...
- 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的,答案可能很大,只能输 ...
随机推荐
- JSP、Servlet、JDBC学习笔记
WEB的学习 * 服务器 * 网络的架构(面试题) * C/S client/server 客户端/服务器端 例子:QQ 快播 暴风影音 * 优点:交互性好,服务器压力小. * 缺点:客户端更新了,下 ...
- Alpha冲刺No.8
一.站立式会议 解决真实手机中出现的各种问题 细化界面设计 数据库上传与获取日拍 二.项目实际进展 能够上传和获取日拍信息 界面设计微调 三.燃尽图 四.团队合照 五.总结 白天金工实习,晚上才有时间 ...
- C语言第二次作业---分支结构
一.PTA实验作业 题目1:计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if(x>=0){ y=sqrt(x); } ...
- 代码中输入数字自动筛选出最大值,使用array,for loop and if (21.9.2017)
# include <stdio.h> # define N main(){ int a, b; ,,,,,,,,,,,,,,,,}; //array中输入需要排序的数字 ]; ; a & ...
- github上传时出现error: src refspec master does not match any解决办法
github上传时出现error: src refspec master does not match any解决办法 这个问题,我之前也遇到过,这次又遇到了只是时间间隔比较长了,为了防止以后再遇到类 ...
- 《高级软件测试》JIRA使用手册(二)JIRA安装
Jira Software 下载地址 Windows系统x86平台:https://downloads.atlassian.com/software/jira/downloads/atlassian- ...
- Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇——多页面VueSSR+热更新Server)
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇--多页面VueSSR+热更新Server) @(HTML/JS) 这是Vue多页面框架系列文章的第二篇,上一篇(纯前 ...
- Python内置函数(27)——range
英文文档: range(stop) range(start, stop[, step]) Rather than being a function, range is actually an immu ...
- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'like '%逸%'' at line 1
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- 新概念英语(1-1)Excuse me!
Excuse me!Whose handbag is it? A:Excuse me! B:Yes? A:Is this your handbag? B:Pardon? A:Is this your ...