组合数学起步-排列计数[ZJOI2010][BZOJ2111]
所以就是小根堆了:小根堆的形态不变,只要找填数的方案,
那么这里如何做呢?
对于每一个叶子节点和唯一值,只有一种方案
然后对于根节点,比根大的数作为叶节点,只要分成两部分就可以
但是如何分也不必要记录,只要记录方案数
由于是分步求解,
所以要把每个子树上的方法与本次分的方法相乘。
式子:$dp[i]=C_{siz[i]-1}^{siz[2*i]}*dp[i*2]*dp[i*2+1]$其中$siz[i]$是以$i$为根的树节点数
于是就可以得到结果$dp[1]$
当然要从$n$跑到$1$了
下面是另一部分
$C_n^m\%p$怎么求?
卢卡斯定理,p一定要是素数。
具体证明和代码见这里
蒟蒻不会了~~
然后里面的细节就是,求阶乘及其逆元,可以打表,现求逆元也可以。
用 $a^{p-2}$ 的快速幂求逆元
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 2000100
#define LL long long
using namespace std;
LL p,n;
int siz[N];
LL fac[N],inv[N],dp[N];
LL ppow(LL a,LL b){
LL k=;
while(b){
if(b&)k=k*a%p;
a=a*a%p;
b>>=;
}
return k;
}
void prerun(){
for (int i=n;i>=;i--){
siz[i]=siz[i*]+siz[i*+]+;
}
fac[]=;
for (int i=;i<=n;i++){
fac[i]=fac[i-]*i%p;
}
}
LL C(LL m,LL n){
if(n<m)return ;
return fac[n]*ppow(fac[m],p-)%p*ppow(fac[n-m],p-)%p;
}
LL lucas(LL m,LL n){
if(m==)return ;
return lucas(m/p,n/p)*C(m%p,n%p)%p;
}
int main (){
scanf("%lld%lld",&n,&p);
prerun();
for (int i=n;i>=;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;
}
printf("%lld\n",dp[]);
return ;
}
真不知道没有题解怎么活~~
主要参考:Rorschach_XR的[ZJOI2010]排列计数 题解
组合数学起步-排列计数[ZJOI2010][BZOJ2111]的更多相关文章
- 【BZOJ2111】[ZJOI2010]排列计数(组合数学)
[BZOJ2111][ZJOI2010]排列计数(组合数学) 题面 BZOJ 洛谷 题解 就是今年九省联考\(D1T2\)的弱化版? 直接递归组合数算就好了. 注意一下模数可以小于\(n\),所以要存 ...
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- BZOJ_4517_[Sdoi2016]排列计数_组合数学
BZOJ_4517_[Sdoi2016]排列计数_组合数学 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[ ...
- 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: ...
- [ZJOI2010]排列计数 (组合计数/dp)
[ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- P2606 [ZJOI2010]排列计数
P2606 [ZJOI2010]排列计数 因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树.现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质. 设\(f(i)\)表示以\ ...
随机推荐
- 图片上传的ImageIO工具类
ImageIO类说明 最近的项目中遇到ImageIO,因此记录下这个类的用法 一.ImageIO: 这个类中的方法都是静态方法,可以用来进行简单的图片IO操作 1.读入的三种方法 public sta ...
- python Mean Squared Error vs. Structural Similarity Measure两种算法的图片比较
# by movie on 2019/12/18 import matplotlib.pyplot as plt import numpy as np from skimage import meas ...
- MSSQLSERVER跨服务器连接(远程登录)的示例代码
MSSQLSERVER跨服务器链接服务器创建方法如下 复制代码 代码如下: --声明变量 Declare @svrname varchar(255), @dbname varchar(255), @s ...
- 廖雪峰Java12maven基础-1maven入门-3构建流程
maven是一个Java项目管理和构建工具: 标准化项目结构 标准化构建流程(编译.打包.发布) 依赖管理 Maven的构建流程 clean 删除所有编译生成的文件 compile 编译源码.编译测试 ...
- thinkphp 快捷查询
快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如: 大理石平台价格 一.不同字段相同的 ...
- mysql 一次性插入的数据量过大报错max_allowed_packet解决方法
查询: show VARIABLES like ‘%max_allowed_packet%‘; 记录下数字(默认是一个7位) 执行语句: ; 重启服务 再查询 该数字 ,如果没变,则修改mysql的m ...
- php curl的隐藏BUG
<?php $a = array( 'a' => 2, 'b' => 3, ); $curl = curl_init(); $b = $a; curl_setopt_array($c ...
- MYSQL批量创建表的存储过程
因为业务需要,创建了100个表,但是这些表的结构都是一样的,作为程序员,就是要解决这种重复劳动.然而这种事情还要单独写个php脚本的话太麻烦了吧,所以就干脆学了一下直接用Mysql存储过程怎么实现: ...
- 元素显示v-show
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- centos7中给Elasticsearch5 安装bigdesk
系统:centos7 elasticsearch:5.2.2 安装步骤 步骤 由于elasticsearch不再建议支持插件的安装方式.建议作为独立的程序来安装类似于bigdesk.head. 以前都 ...