洛谷题目链接:[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. hdu1010--Tempter of the Bone(迷宫)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Jav ...

  2. js正则表达式匹配斜杠 网址 url等

    项目中有个需求,需要从url中截取ID.需要在前台用js匹配截取,所以就百度一下,发现都没有说清楚,所以这里就总结下. 正则表达式如下: var epId=0; //工厂企业ID var urlInd ...

  3. Visual C++ 8.0对象布局

    哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout ...

  4. Apache 的知识点

    apache 的官方文档 http://httpd.apache.org/docs/ Mac下如何查看Apache的版本 在终端(Terminal)中输入 apachectl -v,之后回车,结果如下 ...

  5. SpringMVC 应知应会

    springMVC 是表现层技术,可以用来代替 struts2,下面是简略图:主要是处理器和视图,只有这两个部分需要编写代码. springMVC 三大组件:处理器映射器,处理器适配器,视图解析器. ...

  6. Android 混淆签名打包

    1.混淆文件 proguard-rules.pro # Add project specific ProGuard rules here. # By default, the flags in thi ...

  7. 第132天:移动web端-rem布局(进阶)

    rem布局(进阶版) 该方案使用相当简单,把下面这段已压缩过的 原生JS(仅1kb,源码已在文章底部更新,2017/5/3) 放到 HTML 的 head 标签中即可(注:不要手动设置viewport ...

  8. hdu 6434 Count (欧拉函数)

    题目链接 Problem Description Multiple query, for each n, you need to get $$$$$$ \sum_{i=1}^{n} \sum_{j=1 ...

  9. bzoj1050[HAOI2006]旅行comf(枚举+贪心+并查集)

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

  10. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...