组合数学起步-排列计数[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)\)表示以\ ...
随机推荐
- [转]Java四种线程池的使用
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- java.util.concurrent中的几种同步工具类
java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...
- Ionic3 demo TallyBook 实例1
1.创建项目 ionic start TallyBook blank 创建一个空的项目 ionic cordova platform add android 添加andorid平台 io ...
- vue 单纯的获取经纬度 百度与高德 H5
首先用百度的api举个例子 首先在index页面引入如下: <script type="text/javascript" src="http://api.map.b ...
- SQLServer索引的四个高级特性
一Index Building Filter索引创建时过滤 二Index Include Column索引包含列 三聚集索引Cluster Index 四VIEW INDEX视图索引 SQLSer ...
- System.Web.Mvc.PartialViewResult.cs
ylbtech-System.Web.Mvc.PartialViewResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, ...
- “Error: Encountered an improper argument”的解决方法
之前遇到过的问题,后来解决后再次遇到又忘记了, 这是keil 的bug 路径只要都是字母就可以了
- gatekeeper学习概述
1.概述 该产品部署在网络隔离装置两端,以代理程序的身份,完成两侧设备连接维护,数据转发的功能.场景简化如图所示: 软件核心是一个基于Netty的网络应用程序,考虑到系统的可维可测性,集成了web化的 ...
- sqlserver存储过程事务回滚
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[AddUserOnChannel] ), ), @Channe ...
- 11-6-es5选项卡
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...