可以发现,整个数列构成一个树形结构,并且是个完全二叉堆(小根堆)。

并且这个堆的形态在给定$n$后是固定的,第1个位置上显然只能放1。

对子树的根来说,他自己是所分得的数集中最小的那个,所以从剩下$sz[i]-1$个数字中,挑一些填满左子树的节点,剩下填右子树,相当于继续向下分配数集,由于只有数字的个数影响结果,所以子问题可以递归求解。

所以有$f[i]=f[i<<1]*f[i<<1|1]*C(sz[i]-1,sz[i<<1])$,其中$f[i]$表示以$i$为根的子树的方案数,$sz[i]$表示以$i$为根的子树的大小,$C(sz[i]-1,sz[i<<1])$表示从$sz[i]-1$中任取了$sz[i<<1]$个;

#include<cstdio>
#include<iostream>
#define R register int
const int M=;
using namespace std;
char B[<<],*S=B,*T=B;
#define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin))?EOF:*S++)
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} int t,n,m,fac[M],Inv[M];
inline int C(int n,int m) {
if(n<m) return ; return fac[n%M]*Inv[fac[m%M]]%M*Inv[fac[(n-m)%M]]%M;
}
inline int L(int n,int m) {
if(n<m) return ; if(!n) return ;
return L(n/M,m/M)*C(n%M,m%M)%M;
}
signed main() {
t=g(); fac[]=fac[]=; Inv[]=;
for(R i=;i<M;++i) fac[i]=fac[i-]*i%M; for(R i=;i<M;++i) Inv[i]=(M-M/i*Inv[M%i]%M)%M;
while(t--) {n=g(),m=g(); printf("%d\n",L(n,m));}
}

2019.06.02

BZOJ 2982 combination 脑子+组合数学的更多相关文章

  1. ZOJ 3557 & BZOJ 2982 combination[Lucas定理]

    How Many Sets II Time Limit: 2 Seconds      Memory Limit: 65536 KB Given a set S = {1, 2, ..., n}, n ...

  2. BZOJ 2982: combination( lucas )

    lucas裸题. C(m,n) = C(m/p,n/p)*C(m%p,n%p). ----------------------------------------------------------- ...

  3. bzoj——2982: combination

    2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 611  Solved: 368[Submit][Status][Di ...

  4. bzoj 2982 combination——lucas模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2982 明明是lucas定理裸题…… 非常需要注意C( )里  if ( n<m ) r ...

  5. BZOJ 2982 combination

    lucas定理裸题. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  6. BZOJ 2982 combination Lucas定理

    题目大意:发上来就过不了审核了--总之大意就是求C(n,m) mod 10007 m,n∈[1,2*10^8] 卢卡斯定理:C(n,m)=C(n%p,m%p)*C(n/p,m/p) mod p 要求p ...

  7. BZOJ 2982: combination Lucas模板题

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 1000003 using namespace std; c ...

  8. 【BZOJ 2982】 2982: combination (卢卡斯定理)

    2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 510  Solved: 316 Description LMZ有n个 ...

  9. 【BZOJ】2982: combination(lucas定理+乘法逆元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2982 少加了特判n<m return 0就wa了QAQ lucas定理:C(n, m)%p=( ...

随机推荐

  1. centos7 宝塔php7安装mongodb扩展

    一.下载.解压源码 下载地址:https://pecl.php.net/package/mongodb wget -c https://pecl.php.net/get/mongodb-1.5.3.t ...

  2. MySQL 按照日期格式查询带有时间戳数据

    按照日期格式查询带有时间戳数据一般在MSQL数据库中的时间都是以时间戳的格式来存储时间的,但是对于我们来说,时间戳格式具体表示的是什么时间,我们很难一眼看出来,所以当我们要具体查询某一个时间或时间段的 ...

  3. 【转】Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联

    本文转自:http://www.cnblogs.com/easygame/p/3622893.html EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关 ...

  4. 怎样修改 VS Code 主题?

    方法1. 点击左上角 File > Preferences > Color Theme. 方法2. 使用快捷键: Ctrl + K , Ctrl + T  PS: 查询各种操作的快捷键可以 ...

  5. .net Core 图片验证码 基于SkiaSharp实现

    public class ImageCaptcha { /// <summary> /// 干扰线的颜色集合 /// </summary> private List<SK ...

  6. QT调用CHM方法

    QDesktopServices desktopServices;QString strUrl=QCoreApplication::applicationDirPath () ;strUrl=QStr ...

  7. 使用XPath爬取网页数据

    我们以我的博客为例,来爬取我所有写过的博客的标题. 首先,打开我的博客页面,右键“检查”开始进行网页分析.我们选中博客标题,再次右键“检查”即可找到标题相应的位置,我们继续点击右键,选择Copy,再点 ...

  8. 10 TCP限流技术

    TCP限流是因为让接收方充分接受完消息,保证数据安全,不会丢失 一.窗口机制介绍 发送端和接收端都拥有一个窗口,当发送端发送数据时,落进窗口的数据被发送,当接受端接受数据时,落进接收端窗口的数据将会被 ...

  9. jQuery实现购物车效果

    简单的购物车效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  10. Vue Elementui中的Tag与页面其它元素相互交互

    参考:https://www.jb51.net/article/147917.htm 思路 一.多选框勾选,出现对应的tag: 1.利用watch监听多选框绑定的值A(数组)的变化:2.根据A的变化, ...