洛谷题目链接:[FJOI2016]建筑师

题目描述

小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 \(n\) 个建筑,每个建筑的高度是 \(1\) 到 \(n\) 之间的一个整数。

小 Z 有很严重的强迫症,他不喜欢有两个建筑的高度相同。另外小 Z 觉得如果从最左边(所有建筑都在右边)看能看到 \(A\) 个建筑,从最右边(所有建筑都在左边)看能看到 \(B\) 个建筑,这样的建筑群有着独特的美感。现在,小 Z 想知道满足上述所有条件的建筑方案有多少种?

如果建筑 \(i\) 的左(右)边没有任何建造比它高,则建筑 \(i\) 可以从左(右)边看到。两种方案不同,当且仅当存在某个建筑在两种方案下的高度不同。

输入输出格式

输入格式:

第一行一个整数 \(T\),代表 \(T\) 组数据。 接下来 \(T\) 行,每行三个整数 \(n,A,B\)。

输出格式:

对于每组数据输出一行答案 \(\text{mod } 10^9+7\)。

输入输出样例

输入样例#1:

2

3 2 2

3 1 2

输出样例#1:

2

1

说明

对于 \(10 \%\) 的数据 : \(1 \leq n \leq 10\)。

对于 \(20 \%\) 的数据 : \(1 \leq n \leq 100\)。

对于 \(40 \%\) 的数据 : \(1 \leq n \leq 50000, \ 1 \leq T \leq 5\)。

对于 \(100 \%\) 的数据 :\(1 \leq n \leq 50000, \ 1 \leq A, B \leq 100, \ 1 \leq T \leq 200000\)。

题解:

首先来介绍一下斯特林数

这里只需要用到第一类斯特林数.

其实第一类斯特林数\(S(n, m)\)所代表的意义就是将\(n\)个数分成\(m\)个圆排列的方案数.我们知道\(S(n, m)=S(n-1, m-1)+(n-1)*S(n-1, m)\)可以这样理解,我们分两种情况讨论方案数,如果新加入一个数:

  1. 让它单独组成一个环,方案数为\(S(n-1,m-1)\).
  2. 将它放在之前\(n-1\)个数的左边,方案数为\((n-1)*S(n-1, m)\).

既然了解了斯特林数的含义,那么这里就可以拿来用了.

考虑找到最高的建筑,它一定会将左右两遍分成两个部分,且左边可以看见\(A-1\)个建筑,右边可以看见\(B-1\)个建筑.

那么除去我们挑出来的最高的建筑,还剩下\(n-1\)个建筑,我们需要将这\(n-1\)个建筑分成\(A+B-2\)个建筑群.一个建筑群指的是一栋可以被看见的建筑和在它后面被挡住的建筑.就像下面这张图红色框框内的建筑:

我们知道,建筑群需要让最高的建筑在最边上,这样才能保证这个建筑群内的建筑只有一座被看见,所以,一个建筑群内的排列相当于是一个圆排列(圆排列是经过旋转之后不相同的排列,也就是说圆排列中的任意一个排列都可以通过旋转来让最高的在最边缘).

然后产生了\(A+B-2\)个建筑群之后,我们需要选\(A-1\)个放在最高的建筑的左边,也就是\(C(A+B-2, A-1)\).

所以最后的答案就是\(C(A+B-2, A-1)*S(n-1, A+B-2)\),先预处理一下就可以\(O(1)\)回答了.

记得要开\(long\ long\)

#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
const int NN = 200+5;
const int mod = 1e9+7;
typedef int _int;
#define int long long int T, n, a, b, C[NN][NN], S[N][NN]; _int main(){
cin >> T, C[0][0] = S[0][0] = 1;
for(int i = 1; i <= 200; i++) C[i][i] = C[i][0] = 1;
for(int i = 1; i <= 200; i++)
for(int j = 1; j <= i; j++) C[i][j] = (C[i-1][j]+C[i-1][j-1])%mod;
for(int i = 1; i <= 50000; i++)
for(int j = 1; j <= 200; j++) S[i][j] = (S[i-1][j-1]+(i-1)*S[i-1][j]%mod)%mod;
while(T--){
cin >> n >> a >> b;
cout << C[a+b-2][a-1]*S[n-1][a+b-2]%mod << endl;
}
return 0;
}

[洛谷P4609] [FJOI2016]建筑师的更多相关文章

  1. 洛谷 P4609: [FJOI2016] 建筑师

    本省省选题是需要做的. 题目传送门:洛谷P4609. 题意简述: 求有多少个 \(1\) 到 \(N\) 的排列,满足比之前的所有数都大的数正好有 \(A\) 个,比之后的所有数都大的数正好有 \(B ...

  2. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】

    题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...

  3. 洛谷P4609 [FJOI2016]建筑师(第一类斯特林数+组合数)

    题面 洛谷 题解 (图片来源于网络,侵删) 以最高的柱子\(n\)为分界线,我们将左边的一个柱子和它右边的省略号看作一个圆排列,右边的一个柱子和它左边的省略号看作一个圆排列,于是,除了中间的最高的柱子 ...

  4. [洛谷4609] [FJOI2016]建筑师

    题目描述 LOJ题面:https://loj.ac/problem/2173. 洛谷题面:https://www.luogu.org/problemnew/show/P4609. Solution [ ...

  5. Luogu P4609 [FJOI2016]建筑师&&CF 960G Bandit Blues

    考虑转化题意,我们发现其实就是找一个长度为\(n\)的全排列,使得这个排列有\(A\)个前缀最大值,\(B\)个后缀最大值,求方案数 我们考虑把最大值拎出来单独考虑,同时定义一些数的顺序排列为单调块( ...

  6. 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】

    题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...

  7. 洛谷P4587 [FJOI2016]神秘数(主席树)

    题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...

  8. P4609 [FJOI2016]建筑师

    思路 裸的第一类斯特林数,思路和CF960G相同 预处理组合数和第一类斯特林数回答即可 代码 #include <cstdio> #include <cstring> #inc ...

  9. P4609 [FJOI2016]建筑师(第一类斯特林数)

    传送门 没想到连黑题都会有双倍经验的 其实这题本质上是和CF960G Bandit Blues一样的,不过那里是要用分治FFT预处理第一类斯特林数,这里直接打表预处理第一类斯特林数就可以了 //min ...

随机推荐

  1. 404 Note Found 现场编程

    目录 组员职责分工 github 的提交日志截图 程序运行截图 程序运行环境 GUI界面 基础功能实现 运行视频 LCG算法 过滤(降权)算法 算法思路 红黑树 附加功能一 背景 实现 附加功能二(迭 ...

  2. HDU 5655 CA Loves Stick 水题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5656 CA Loves Stick Accepts: 381   Submissions: 3204 ...

  3. 读 《我是一只IT小小鸟》 有感

    在没有上大学之前,我很迷茫自己将来要从事什么行业.有人说,人生的每一个阶段都应该有自己的目标,然而,我上大学之前,甚至大一下学期之前,我对于我今后的从业道路,人生规划,都是迷茫的.高考结束成绩出来后, ...

  4. JSON.parse与eval

    文章:JSON.parse 与 eval() 对于解析json的问题 json的标准格式:{"name":"jobs"}   名字和值都必须用双引号引起来.

  5. 不要USB数据线调试Android开发

    不管是过去Eclipse还是现在的Android Studio开发Android,运行或者调试时都会利用USB数据线连接电脑和手机,特别是当现在的手机只有一个Type-c接口,意味着,插上后,啥也干不 ...

  6. WebForm与MVC模式优缺点

    Asp.net Web开发方式,分为两种: 1. WebForm开发 2. Asp.Net MVC开发 MVC是微软对外公布的第一个开源的表示层框架,MVC目的不是取代WebForm开发,只是web开 ...

  7. 2nd 历年学生作品评论(3部)

    历年学生作品评论(3部) 1.基于GUI的图书管理系统 利用NABCD模型进行竞争性需求分析:http://www.cnblogs.com/chitty/p/4546876.html 测试说明书: h ...

  8. 【final】140字互评②

    按照产品发布顺序 nice!----约吧 我们的团队展示相对于上次的手足无措,有了一定进步.但是整体还是不那么流畅总结起来的缺点是: 1.发布时,摄像头不清晰 且抖动 我们没有把摄像头固定,并且为了让 ...

  9. gridview 第一行编辑

    <%@ Page Language="C#" AutoEventWireup="true" Codebehind="Default.aspx.c ...

  10. 主流的RPC框架有哪些

    RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还 ...