组合数学起步-排列计数[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)\)表示以\ ...
随机推荐
- NuGet 命令行使用EntityFrameWork
初始化 Enable-migrations 迁移 Add-Migration Donator_Add_CreationTime 执行操作 UpDate-database 撤销更改 Update-Dat ...
- 2016.10.29初中部上午NOIP普及组比赛总结
2016.10.29[初中部 NOIP普及组 ]模拟赛 做得好爽! 进度: 比赛:35+45+AC+0=180 改题:AC+AC+AC+0=300 幸运的数 有点无语--之前怕超限,还特意利用程序打了 ...
- 廖雪峰Java11多线程编程-3高级concurrent包-1ReentrantLock
线程同步: 是因为多线程读写竞争资源需要同步 Java语言提供了synchronized/wait/notify来实现同步 编写多线程同步很困难 所以Java提供了java.util.concurre ...
- css - 常见知识点
1. 盒模型 页面渲染时,dom 元素所采用的 布局模型.可通过box-sizing进行设置.根据计算宽高的区域可分为: content-box (W3C 标准盒模型) border-box (IE ...
- iOS之UIBezierPath贝塞尔曲线属性简介
#import <Foundation/Foundation.h> #import <CoreGraphics/CoreGraphics.h> #import <UIKi ...
- CF #575 Div3
// 比赛链接:https://codeforces.com/contest/1196 // CF 2019.7.24 // 本想Div3手速场上分,结果卡在C题,掉了不少分. // 自闭了这么久,今 ...
- php析构函数小结
l 基本语法 class 类名{ public function __destruct(){ //函数体 //析构函数的最重要的作用,就是释放对象创建的资源 //比如 数据库连接, 文件句柄, ...
- Java(8)中List的遍历方式总结
本篇文章主要讲述了List这一集合类型在Java,包括Java8中的遍历方式,不包括其他的过滤,筛选等操作,这些操作将会在以后的文章中得到提现,由List可以类推到Set等类似集合的遍历方式. pub ...
- mysql80版本—yum安装—图文全过程
这是官网的Quick Giude:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ 以下为自己安装的步骤: 第一步:下载.rpm安装包 ...
- <每日一题>题目17:super()继承相关的面试题
class A(object): def go(self): print("go A go!") def stop(self): print("stop A stop!& ...