洛谷题目链接:[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. C# string 常用方法

    string.ToString().Contains() String str="abcd" str.ToString().Contains("a"); //t ...

  2. web.config详解(转载)

    该文为转载 原文地址:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html 花了点时间整理了一下ASP.NET Web.c ...

  3. ACM 第二十天

    积性函数.杜教筛 练习题 莫比乌斯函数之和 51Nod - 1244 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号. ...

  4. Java compiler level does not match the version of the installed Java project facet. map解决方法

    右键项目"Properties",在弹出的"Properties"窗口左侧,单击"Project Facets",打开"Proje ...

  5. J2EE十三种技术规范介绍

    J2EE的十三个技术规范 J2EE体系结构 一.JDBC:Java Data Base Connectivity,数据库连接 我们大家对微软公司的ODBC数据库访问接口比较熟悉,而在Java中创建数据 ...

  6. 当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用

    当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用

  7. 【loj6342】跳一跳 期望dp

    题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...

  8. 【Java】JAVA开发人员常见环境工具安装

    1.安装配置JDK1.7:jdk-7u45-windows-x64.exe,环境变量配置:JAVA_HOME---[F:\1024\jdk1.7],CLASSPATH---[.;%JAVA_HOME% ...

  9. 常用yum源

    #epel源 [myepel] name=zheda baseurl=http://mirrors.zju.edu.cn/epel/6/x86_64/ gpgcheck= enabled= #mysq ...

  10. Day21-获取用户请求相关信息及请求头

    1. request里面还包含请求头等信息,可以打印看一下. views.py中的程序 from django.shortcuts import render,HttpResponse from dj ...