2111: [ZJOI2010]Perm 排列计数
2111: [ZJOI2010]Perm 排列计数
题意:
称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i>P_{i/2}$. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值
虽然是中文题,但是想加上markdown。
思路:
好题!
lucas定理+dp。
题目要求大小为n的小根堆的方案数,(即给定的二叉树的父节点大于子节点)。
f[i] 表示以i为根的子树的方案数。siz[i]为大小,即所有的取值。(假设这个子树的取值是1~siz[i])
f[i] = f[i*2] * f[i*2+1] * C(siz[i]-1,siz[i*2])。
f[i*2],f[i*2+1]是左右子树中的取值为1~siz的方案数,所以如果随机给这个子树siz个不同的数,同样是一组合法的方案。(给定的siz个数,可以映射到1~n上)。
所以总方案数就是,从所有的数中,选siz[ls]个,给左子树的方案数(剩下的自然就是给右子树)。首先根一定是1,在剩下的所有数中(siz[i]-1),给左孩子siz[i*2]个数。就是后面的式子。
问题:代码19行加入后,wa?
代码:
- #include<cstdio>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- typedef long long LL;
- const int N = ;
- LL f[N],inv[N],dp[N],siz[N],t[N],p;
- int n,mx;
- void init() {
- f[] = f[] = inv[] = inv[] = t[] = t[] = ;
- for (int i=; i<=mx; ++i) {
- f[i] = (f[i-] * i) % p;
- inv[i] = (-(p/i)*inv[p%i]) % p;
- inv[i] = (inv[i] + p) % p;
- t[i] = t[i-] * inv[i] % p;
- // if (inv[i] * i % p != 1) cout << 'a';
- }
- }
- LL Lucas(LL a,LL b) {
- if (a < b) return ;
- if (a < p && b < p)
- return f[a]*t[b]%p*t[a-b]%p;
- return Lucas(a/p,b/p)*Lucas(a%p,b%p)%p;
- }
- int main() {
- cin >> n >> p;
- mx = min(LL(n),p);
- init();
- for (int i=n; i>=; --i) {
- siz[i] = siz[i<<] + siz[i<<|] + ;
- dp[i] = Lucas(siz[i]-,siz[i<<]);
- if ((i<<)<=n) dp[i] = (dp[i] * dp[i<<]) % p;
- if ((i<<|)<=n) dp[i] = (dp[i] * dp[i<<|]) % p;
- }
- cout << dp[];
- return ;
- }
2111: [ZJOI2010]Perm 排列计数的更多相关文章
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- 【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是素数 ...
- bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i ...
- 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 ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas
题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大, ...
- bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】
是我想复杂了 首先发现大于关系构成了一棵二叉树的结构,于是树形dp 设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1} ...
- bzoj 2111: [ZJOI2010]Perm 排列计数
神题... 扒自某神犇题解: http://blog.csdn.net/aarongzk/article/details/50655471 #include<bits/stdc++.h> ...
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
随机推荐
- 插件使用一进度条---nprogress
nprogress 是像youtube一样在顶部出现进度条,用在一些加载比较缓慢的场景中. 官方网站是 http://ricostacruz.com/nprogress/ 源码在 https://gi ...
- robocopy的用法,数据库局域网备份
robocopy,我主要是用来进行局域网数据库备份使用,不得不说这个小工具速度还是蛮快的,同时属于系统内置功能,用着还算方便. 这项功能就是RoboCopy,它是一个命令行的目录复制命令,自从Wind ...
- jQuery分步步骤
插件描述:jQuery上一步.下一步,分步步骤,兼容性如下: 使用方法 1.引入样式和脚本 <link rel="stylesheet" type="text/cs ...
- MVC Filter
一.Filter在MVC生命周期中的位置 1.IIS中传递请求到程序2.MVC根据Routing来选择由哪个Controller/Action来处理3.Controller调用Model(业务逻辑)来 ...
- Bootstrap富文本编辑器-bootstrap-wysiwyg
在进行英语试题的录入中,因为英语试题经常会有类似如下的试题: My friend watches dragon boat races at the Dragon Boat Festival.(对划线部 ...
- python各个包的用途
python中的多个包的用途 1.Numpy Numpy提供了两种基本的对象:ndarray和ufunc.ndarray是存储单一数据类型的多维数组,而ufunc是能够对数组进行处理的函数. N维数组 ...
- hive中,动态添加map和reduce的大小,以增加并行度
map是配置mapred.max.split.size,来定义map处理文件的大小,默认是256000000字段,换算就是256M. 如果想增加map的并行度,那么就是减少map处理文件的大小即可. ...
- VMware下centos7安装
VMware下centos7安装 转载地址:https://blog.csdn.net/hui_2016/article/details/68927487 一. 软件准备 二. Vmware12安装 ...
- SEED-DVS6467_SDK的交叉编译环境搭建问题
今天在ubuntu16.04上安装arm的交叉编译器arm_v5t_le-gcc,环境变量配置好以后,运行arm_v5t_le-gcc命令,总提示No such file or directory.然 ...
- java中可以对时间进行加减处理,有时候不用在sql语句中处理
String ssny = (String) pd.get("ssny"); SimpleDateFormat simpleDateFormat=new SimpleDateF ...