题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4372

题意:

  有n栋高楼横着排成一排,各自的高度为1到n的一个排列。

  从左边看可以看到f栋楼,从右边看可以看到b栋楼,并且高的楼会挡住低的楼。

  问你这些楼有多少种排列方法。

题解:

  由于高的楼会挡住低的楼,所以这些楼首先会被划分成f+b-2个区域(除去中间最高的楼),并且左边有f-1个,右边有b-1个。

  

  对于一个区域(假设在左边),这个区域由若干栋楼组成,并且最高的楼一定在最左边。

  那么,由一个区域中的元素组成的任意一个环排列,在这个区域中都有唯一的放法,因为要把最高的元素拉到最左边。

  

  所以,原题被简化为:将n-1个元素形成f+b-2个环排列,并将其中f-1个环放在左边的方法数。

  又是第一类Stirling数。

  · 将n-1个元素形成f+b-2个环排列的方法数 = S(n-1,f+b-2)

  · 将其中f-1个环放在左边的方法数 = C(f+b-2,f-1)

  所以答案为:S(n-1,f+b-2)*C(f+b-2,f-1)

  注:此题有不合法数据,要判断一下是否f+b-1>n,如果是,输出0(不合法)。

AC Code:

 // n: tot    f: lef    b: rig
// lef group = f-1
// rig group = b-1
// elem num = n-1
// circle num = f+b-2
// ans = s(n-1, f+b-2) * c(f+b-2, f-1)
// s(n,k) = s(n-1,k-1) + (n-1)*s(n-1,k) #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 2005
#define MOD 1000000007 using namespace std; int n,f,b,t;
long long s[MAX_N][MAX_N];
long long c[MAX_N][MAX_N]; void cal_stirling()
{
memset(s,,sizeof(s));
s[][]=;
for(int i=;i<MAX_N;i++)
{
s[i][i]=;
for(int j=;j<i;j++)
{
s[i][j]=(s[i-][j-]+(i-)*s[i-][j])%MOD;
}
}
} void cal_combination()
{
memset(c,,sizeof(c));
c[][]=;
for(int i=;i<MAX_N;i++)
{
c[i][]=;
for(int j=;j<=i;j++)
{
c[i][j]=(c[i-][j]+c[i-][j-])%MOD;
}
}
} int main()
{
cal_stirling();
cal_combination();
cin>>t;
for(int cas=;cas<=t;cas++)
{
cin>>n>>f>>b;
if(f+b-<=n) cout<<(s[n-][f+b-]*c[f+b-][f-])%MOD<<endl;
else cout<<<<endl;
}
}

HDU 4372 Count the Buildings:第一类Stirling数的更多相关文章

  1. HDU 4372 Count the Buildings [第一类斯特林数]

    有n(<=2000)栋楼排成一排,高度恰好是1至n且两两不同.现在从左侧看能看到f栋,从右边看能看到b栋,问有多少种可能方案. T组数据, (T<=100000) 自己只想出了用DP搞 发 ...

  2. HDU 4372 Count the Buildings——第一类斯特林数

    题目大意:n幢楼,从左边能看见f幢楼,右边能看见b幢楼 楼高是1~n的排列. 问楼的可能情况 把握看到楼的本质! 最高的一定能看见! 计数问题要向组合数学或者dp靠拢.但是这个题询问又很多,难以dp ...

  3. hdu 4372 Count the Buildings 轮换斯特林数

    题目大意 n栋楼有n个不同的高度 现在限制从前面看有F个点,后面看有B个点 分析 最高那栋楼哪都可以看到 剩下的可以最高那栋楼前面分出F-1个组 后面分出B-1个组 每个组的权值定义为组内最高楼的高度 ...

  4. 【HDU 4372】 Count the Buildings (第一类斯特林数)

    Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  5. HDU 4372 - Count the Buildings(组合计数)

    首先想过n^3的组合方法,即f(i,j,k)=f(i-1,j,k)*(i-2)+f(i-1,j-1,k)+f(i-1,j,k-1),肯定搞不定 然后想了好久没有效果,就去逛大神博客了,结果发现需要用到 ...

  6. hdu 4372 Count the Buildings —— 思路+第一类斯特林数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4372 首先,最高的会被看见: 然后考虑剩下 \( x+y-2 \) 个被看见的,每个带了一群被它挡住的楼, ...

  7. HDU 4372 Count the Buildings

    Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  8. HDU 4372 Count the Buildings 组合数学

    题意:有n个点上可能有楼房,从前面可以看到x栋楼,从后面可以看到y栋,问楼的位置有多少种可能. 印象中好像做过这个题,

  9. hdu 4372 第一类stirling数的应用/。。。好题

    /** 大意: 给定一系列楼房,都在一条水平线上,高度从1到n,从左侧看能看到f个, 从右侧看,能看到b个,问有多少种这样的序列.. 思路: 因为肯定能看到最高的,,那我们先假定最高的楼房位置确定,那 ...

随机推荐

  1. Windows10 Enterprise版本周年更新问题

    安装Windows10的时候,蛋疼选择了企业版本,导致后来周年更新遇到了蛋疼的问题. 首先是无法接收到周年更新的推送.记得首个周年更新的时候,等了大半年都没有.后来使用了易升进行更新,可以检测到,但是 ...

  2. 手机app微信支付后台处理流程

    第一步:客户在手机app确认订单,提交订单后,app将订单详情传给后台,后台将订单存入数据库,将存入数据库的id返回给app. 第二步:这时候手机端app会让客户选择哪种付款方式,我们做的是微信,所以 ...

  3. centos+apache 2.x 开启gzip压缩

    最近做了一个网站(PHP+Apache+MySQL),挂在百度云平台上面,基本配置是2G内存+5Mb带宽,每次打开主页都需要2-3s左右的时间,对于一个垂直搜索引擎来说,用户体验肯定会很差. 于是开始 ...

  4. orcle 索引的使用

    2.4.3.1. 索引的概念 数据库中的索引与书籍中的索引类似,在一本书中,利用索引可以快速查找所需信息, 无须阅读整本书.在数据库中,索引使数据库程序无须对整个表进行扫描, 就可以在其中找到所需数据 ...

  5. JS数组例子

    输入10个成绩,求总和,最高和最低 var arr=new Array(97,56,67,56,77,78,67,76,89,98); var sum=0; var minx=100; var max ...

  6. js中嵌入jsp(html)代码的双引号转换问题--事件没反应

    下面是一段今天遇到问题的代码,select中写了onchange事件 ,在没有加转义的情况下,F12解析的代码是错乱的,双引号与内容中写的不一致,还会有空格出现,经过一段时间的摸索,发现在出错的地方加 ...

  7. babel如此简单

    凡是看到这个标题点进来的同学,相信对babel都有了一定的了解.babel使用起来很简单,简单到都没有必要写一篇文章去介绍,直接看看官方文档就可以.所以我也在怀疑到底该不该写这篇文章.想来想去还是决定 ...

  8. nodejs 实践:express 最佳实践 (一)

    express 最佳实践 (一) 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色,, 在 web同构 方面, nodejs 的优势 ...

  9. easyui点击搜索的时候获取不要文本框里面的值的问题

    jsp的代码 <div id="tb"> <input id="AppID" placeholder="请根据申请人ID搜索&quo ...

  10. HDU 5527---Too Rich(贪心+搜索)

    题目链接 Problem Description You are a rich person, and you think your wallet is too heavy and full now. ...