[FJOI2016]建筑师(斯特林数)
【FJOI2016】建筑师
问题描述
小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 n 个建筑,每个建筑的高度是 1 到 n 之间的一个整数。
小 Z 有很严重的强迫症,他不喜欢有两个建筑的高度相同。另外小 Z 觉得如果从最左边(所有建筑都在右边)看能看到 A个建筑,从最右边(所有建筑都在左边)看能看到 B 个建筑,这样的建筑群有着独特的美感。现在,小 Z 想知道满足上述所有条件的建筑方案有多少种?
如果建筑 i 的左(右)边没有任何建造比它高,则建筑 i 可以从左(右)边看到。两种方案不同,当且仅当存在某个建筑在两种方案下的高度不同。
输入格式
第一行一个整数 T,代表 T 组数据。
接下来 T 行,每行三个整数 n,A,B输出格式
对于每组数据输出一行答案 mod10^9+7。
样例输入 1
2
3 2 2
3 1 2样例输出 1
2
1样例输入 2
5
1 1 1
2 1 1
4 3 1
10 2 2
8 6 4样例输出 2
1
0
3
219168
0提示
对于 10% 的数据 : 1≤n≤10
对于 20% 的数据 : 1≤n≤100
对于 40% 的数据 : 1≤n≤50000, 1≤T≤5
对于 100%的数据 :1≤n≤50000, 1≤A,B≤100, 1≤T≤200000
显然最高的那个一定看得见放在哪里都一样,我们不管它。
然后考虑最高的杆子左边的部分(右边同理)
每 两个看得见的杆子之间都可能会有被挡住的杆子,我们把一个看得见的杆子和它挡住的杆子看成一个集合,假设这个集合大小为C,那么在确定集合元素的情况下, 这个集合的排列的方案数实际上就是C个元素圆排列的方案数。因为一个圆排列都对应且仅对应一个合法排列(因为最高的杆子肯定在最左边所以肯定是从最高的杆 子这里断开),所以问题就变成了把n-1个杆子分成a+b-2个圆排列的方案数(因为最高的杆子左边有a-1个这样的集合,右边有b-1个),就 是$S(n-1,a+b-2)$。当然对于每种分法我们要确定这个圆排列是在左边还是在右边,所以要乘上$C(a+b-2,a-1)$。
答案就是$S(n-1,a+b-2)*C(a+b-2,a-1)$,预处理一下$O(1)$回答就好了。
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=l; i<=r; i++) 4 using namespace std; 5 6 const int MOD=1000000007,M=210,N=50010; 7 int s[N][M],C[M][M],T,n,a,b; 8 9 void init(int n,int a) { 10 rep(i,0,n){ 11 s[i][0]=0; 12 if(i<=a) s[i][i]=1; 13 rep(j,1,min(i,a)) s[i][j]=(0ll+s[i-1][j-1]+1ll*(i-1)*s[i-1][j]%MOD)%MOD; 14 } 15 rep(i,0,a){ 16 C[i][0]=1; 17 rep(j,1,i) C[i][j]=(0ll+C[i-1][j]+C[i-1][j-1])%MOD; 18 } 19 } 20 21 int main() { 22 init(50000,200); 23 for (scanf("%d",&T); T--; ) 24 scanf("%d%d%d",&n,&a,&b),printf("%lld\n",(1ll*s[n-1][a+b-2]*C[a+b-2][a-1])%MOD); 25 return 0; 26 }
转载于:https://www.cnblogs.com/HocRiser/p/8566080.html
[FJOI2016]建筑师(斯特林数)相关推荐
- 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...
- 建筑师 第一类斯特林数
文章目录 目录 题意: 思路: 目录 题意: 给你一个nnn的排列,排列中的数代表他的高度,问你有多少个排列能使得从左边能看到aaa个建筑,从右边能看到bbb个建筑. 如果建筑iii左边没有任何比他高 ...
- 《小学生都能看懂的三类斯特林数从入门到升天教程 》(含性质完整证明、斯特林反演、拉赫数)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 真的特别简单,我尽量讲的详细一些,本文包含了几乎所有性质定理证明,老少皆宜 ~ 内容过多,质量过硬,建 ...
- 第一类和第二类斯特林数
第一类斯特林数 第一类斯特林数定义如下: \(s_1(n,k)\)表示\(n\)个元素组成\(k\)个圆排列的方案数. 其中\(n\)个元素的圆排列定义为\(n\)个元素围成一圈的排列,两个圆排列本质 ...
- 快速求斯特林数总结(洛谷模板题解)
题目链接 第一类斯特林数·行 第一类斯特林数·列 第二类斯特林数·行 第二类斯特林数·列 求一行第一类斯特林数 由第一类斯特林数的推论,\(x^{\overline{n}}=\sum_i\begin{ ...
- 【2019雅礼集训】【CF 960G】【第一类斯特林数】【NTT多项式】permutation
目录 题意 输入格式 输出格式 思路 代码 题意 找有多少个长度为n的排列,使得从左往右数,有a个元素比之前的所有数字都大,从右往左数,有b个元素比之后的所有数字都大. n<=2*10^5,a, ...
- BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...
- 【BZOJ 4555】[Tjoi2016Heoi2016]求和 多项式求逆/NTT+第二类斯特林数
出处0.0 用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O( ...
- 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
第一类斯特林数 定理: 第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数. 证明:把上述定理叙述中的循环排列叫做圆圈 递推公式: S1(p,p)=1(p>=0),有p个 ...
最新文章
- linux磁盘管理原理,Linux操作系统中磁盘存储区管理的原理与技巧
- ansible高级应用示例
- android 接口定义常量,Android开发笔记(5):常量的合理使用
- 给 EF Core 查询增加 With NoLock
- Java中的list、set、map区别
- 从计算机基础知识到机器学习第1堂课,最适合新手的5场直播来了
- 【Docker】Docker java shell ssh
- 小学教师计算机应用培训通讯稿,暑期培训通讯稿
- zookeeper的acl权限控制_zookeeper权限acl与四字命令
- fatal: 无法访问 ‘x.git/‘gnutls_handshake() failed: The TLS connection was non-properly terminated.解决办法
- python关闭函数解释器_深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!...
- 小米 admob广告 ID_3月产品更新如何做好再营销广告归因!
- JSON和API接口初识
- html网页的说课稿,【必备】说课稿模板集锦六篇
- 一篇文章搞懂 Hadoop RPC 到底是什么
- KANZI入门第一篇之kanzi详解,教你轻松学kanzi
- 《SAP HANA平台应用开发》—第2章2.1节熟悉HANA开发环境
- 虚拟机Ubuntu18.04开机后没有网络的解决办法
- 2021安居育才中学高考成绩查询,育才中学2017高考成绩
- python打印一整年的日历
热门文章
- php伪造页面url地址,php 伪造HTTP_REFERER页面URL来源的三种方法
- 删除文件夹下所有的文件_Mac 删除文件/文件夹方法和快捷键
- abs 不会整数 方法 溢出_在 Golang 中针对 int64 类型优化 abs()
- c语言中void delay0.5(),单片机彩灯是怎样点亮
- php mysql返回条数据,php – MySQL两次返回数据
- mysql5.7gtid_MySQL5.7 GTID 运维实战
- java 同步块 抛出异常_不把 wait 放在同步块中,为啥这种情况不会抛出 IllegalMonitorStateException?...
- 关于修改session的生存时间以及回收机制
- android studio 显示view树_Android 沉浸式解析和轮子使用
- C语言求m中n个数字的组合