【FJOI2016】建筑师
安利另外一篇\(blog\)
密码泥萌都知道
题面
题解
为了描述方便,这里将建筑称作\(zsy\)
高度为\(n\)的\(zsy\)无论如何都能从左右两侧看到。剩下的部分,从左边看到的是前缀\(max\),从右侧看到的是后缀\(max\)。大概像这样:

对于被框住的\(A+B−1\)个部分,只有第一个能作为前、后缀\(max\)被看到。可以认为是把数分成\(A+B−1\)个圆排列,其中有一个仅包含\(n\)。剩下的\(A+B−2\)个,先决定放在\(n\)的左边还是右边。然后,将每个圆排列的将最大值钦定为所在方向(左或右)上的第一个,并以此为关键字将圆排列排序后放置。
所以对于一组询问,答案就是:
\]
代码
#include<bits/stdc++.h>
#define RG register
#define clear(x, y) memset(x, y, sizeof(x));
using namespace std;
inline int read()
{
    int data=0, w=1;
    char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') w=-1, ch=getchar();
    while(ch>='0'&&ch<='9') data=data*10+(ch^48), ch=getchar();
    return data*w;
}
const int mod(1e9 + 7), maxn(50010), maxk(210), K(201);
int T, n, A, B, C[maxk][maxk], S[maxn][maxk];
inline void Init()
{
    C[0][0] = 1;
    for(RG int i = 1; i <= K; i++)
    {
        C[i][0] = C[i][i] = 1;
        for(RG int j = 1; j < i; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
    }
    for(RG int i = 0; i <= K; i++) S[i][i] = 1;
    for(RG int i = 2; i <= maxn - 10; i++)
        for(RG int j = 1; j < i && j <= K; j++)
            S[i][j] = (1ll * (i - 1) * S[i - 1][j] % mod + S[i - 1][j - 1]) % mod;
}
int main()
{
    T = read(); Init();
    while(T--)
    {
        n = read(); A = read(); B = read();
        if(A + B > n + 1) { puts("0"); continue; }
        printf("%lld\n", 1ll * C[A + B - 2][A - 1] * S[n - 1][A + B - 2] % mod);
    }
    return 0;
}
												
											【FJOI2016】建筑师的更多相关文章
- 【LG4609】[FJOI2016]建筑师
		
[LG4609][FJOI2016]建筑师 题面 洛谷 题解 (图片来源于网络) 我们将每个柱子和他右边的省略号看作一个集合 则图中共有\(a+b-2\)个集合 而原来的元素中有\(n-1\)个(除去 ...
 - [洛谷P4609] [FJOI2016]建筑师
		
洛谷题目链接:[FJOI2016]建筑师 题目描述 小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 \(n\) 个建筑,每个建筑的高度是 \(1\) 到 \(n\) 之间的一 ...
 - Luogu P4609 [FJOI2016]建筑师&&CF 960G Bandit Blues
		
考虑转化题意,我们发现其实就是找一个长度为\(n\)的全排列,使得这个排列有\(A\)个前缀最大值,\(B\)个后缀最大值,求方案数 我们考虑把最大值拎出来单独考虑,同时定义一些数的顺序排列为单调块( ...
 - [FJOI2016]建筑师
		
题目描述 小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 n 个建筑,每个建筑的高度是 1 到 n 之间的一个整数. 小 Z 有很严重的强迫症,他不喜欢有两个建筑的高度相同. ...
 - Luogu4609 FJOI2016 建筑师 第一类斯特林数
		
题目传送门 题意:给出$N$个高度从$1$到$N$的建筑,问有多少种从左往右摆放这些建筑的方法,使得从左往右看能看到$A$个建筑,从右往左看能看到$B$个建筑.$N \leq 5 \times 10^ ...
 - Luogu4609 FJOI2016建筑师(斯特林数)
		
显然排列中的最大值会将排列分成所能看到的建筑不相关的两部分.对于某一边,将所能看到的建筑和其遮挡的建筑看成一个集合.显然这个集合内最高的要排在第一个,而剩下的建筑可以随便排列,这相当于一个圆排列.同时 ...
 - P4609 [FJOI2016]建筑师
		
思路 裸的第一类斯特林数,思路和CF960G相同 预处理组合数和第一类斯特林数回答即可 代码 #include <cstdio> #include <cstring> #inc ...
 - 洛谷 P4609: [FJOI2016] 建筑师
		
本省省选题是需要做的. 题目传送门:洛谷P4609. 题意简述: 求有多少个 \(1\) 到 \(N\) 的排列,满足比之前的所有数都大的数正好有 \(A\) 个,比之后的所有数都大的数正好有 \(B ...
 - [Luogu4609][FJOI2016]建筑师
		
luogu description 一个\(1...n\)的排列,其前缀最大值有\(A\)个,后缀最大值有\(B\)个,求满足要求的排列数. 一个位置\(i\)满足前缀最大当且仅当不存在\(j< ...
 - [FJOI2016]建筑师 斯特林数
		
早期作品,不喜轻喷. LG传送门 组合数与斯特林数的基本应用. 组合数 大家应该都熟悉它的表达式,但我们这里使用它的递推式会更加方便,下面推导组合数的递推式.设\(\binom{n}{m}\)表示在\ ...
 
随机推荐
- SQLServer SELECT   @@IDENTITY 遇到的坑
			
经常在写存储过程的时候获取当前插入后的ID都会用 @@IDENTITY 但是今天在用 @@IDENTITY的时候涉及到当前数据的插入会有insert触发器发生时,发现与实际插入的ID值对不上,网上查 ...
 - 1. 跟踪标记 (Trace Flag) 1117, 1118 文件增长及空间分配方式
			
跟踪标记:1117 功能: 默认,同一个文件组下的多个文件,如果某个文件没有可用空间,且设置了自动增长,则该文件自动增长,其他文件大小保持不变: 开启后,同一文件组下的多个文件,如果某个文件没有可用空 ...
 - Linux 系统调整内核参数
			
调整系统内核参数 内核优化:Linux系统(内核 + shell + 应用程序) 针对业务服务应用而进行的系统内核参数调整(主要是/etc/sysctl.conf文件) 1. vim /e ...
 - 理解http请求
			
HTTP请求的GET方法可以用来抓取网页. HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则,计算机专家设计出HTTP,使HTTP客户(如Web浏览 ...
 - $.ajax 在请求没有完成,是可以往下继续执行js代码的
			
$.ajax({ url:url, data:{}, success:function(arr) { var varHtml='<option value="" checke ...
 - 微信JSSDK与录音相关的坑
			
微信JSSDK与录音相关的坑 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷不丁地被坑一道, 让我时常想嘶吼: "微信JSSDK就是个大腊鸡!!!!!!!! ...
 - #001 HTML快速入门讲解
			
整理了下最早开始学习技术的笔记 3W1H学习法? (其他技术同理) What HTML是什么? When 什么时候使用HTML? Why 为什么使用HTMl? HOW 怎么使用HTML ...
 - mysql5.7.22的安装与配置(适用mysql5.7.20至mysql5.7.22版本)
			
一.解压Mysql5.7.20安装包,刚解压是没有 data 这个文件夹的 二.配置mysql环境变量,创建MYSQL_HOME,然后在Path上添加%MYSQL_HOME%\bin; 三.配置m ...
 - [USACO09MAR]Cow Frisbee Team
			
嘟嘟嘟 这个是一个很明显的dp,遇到这种倍数的问题的,就令dp[i][j]表示选到了第 i 只牛(不是选了 i 只牛),sum(Ri) % f == j 的方案数,则, dp[i][j] = dp[i ...
 - 集合之ArrayList
			
一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类 ...