HDU 4372 Count the Buildings:第一类Stirling数

题目链接: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:

 1 // n: tot    f: lef    b: rig
 2 // lef group = f-1
 3 // rig group = b-1
 4 // elem num = n-1
 5 // circle num = f+b-2
 6 // ans = s(n-1, f+b-2) * c(f+b-2, f-1)
 7 // s(n,k) = s(n-1,k-1) + (n-1)*s(n-1,k)
 8
 9 #include <iostream>
10 #include <stdio.h>
11 #include <string.h>
12 #define MAX_N 2005
13 #define MOD 1000000007
14
15 using namespace std;
16
17 int n,f,b,t;
18 long long s[MAX_N][MAX_N];
19 long long c[MAX_N][MAX_N];
20
21 void cal_stirling()
22 {
23     memset(s,0,sizeof(s));
24     s[0][0]=1;
25     for(int i=1;i<MAX_N;i++)
26     {
27         s[i][i]=1;
28         for(int j=1;j<i;j++)
29         {
30             s[i][j]=(s[i-1][j-1]+(i-1)*s[i-1][j])%MOD;
31         }
32     }
33 }
34
35 void cal_combination()
36 {
37     memset(c,0,sizeof(c));
38     c[0][0]=1;
39     for(int i=1;i<MAX_N;i++)
40     {
41         c[i][0]=1;
42         for(int j=1;j<=i;j++)
43         {
44             c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;
45         }
46     }
47 }
48
49 int main()
50 {
51     cal_stirling();
52     cal_combination();
53     cin>>t;
54     for(int cas=1;cas<=t;cas++)
55     {
56         cin>>n>>f>>b;
57         if(f+b-1<=n) cout<<(s[n-1][f+b-2]*c[f+b-2][f-1])%MOD<<endl;
58         else cout<<0<<endl;
59     }
60 }
时间: 2024-10-05 23:08:56

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

HDU 4372 Count the Buildings(组合数学-斯特林数,组合数学-排列组合)

Count the Buildings Problem Description There are N buildings standing in a straight line in the City, numbered from 1 to N. The heights of all the buildings are distinct and between 1 and N. You can see F buildings when you standing in front of the

HDU 4372 Count the Buildings(组合数+斯特林数)

 题意:N座高楼,高度均不同且为1-N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数. 思路:一开始想的是dp,但是数据范围达到2000,空间复杂度无法承受. 考虑以最高的楼分界,左边有f-1个递增的楼,右边有b-1个递减的楼,考虑将剩下n-1楼分为f+b-2组,规定每组中最高的在最左边,那么只需要 再从n-1组选出f-1组放到左边即可. 现在解决将n-1个楼分为f+b-2组每组最高的楼在左边的这个问题,这等价于将n-1个楼分为f+b-2个环的排列数,因为长度为n

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

1 /** 2 大意: 给定一系列楼房,都在一条水平线上,高度从1到n,从左侧看能看到f个, 从右侧看,能看到b个,问有多少种这样的序列.. 3 思路: 因为肯定能看到最高的,,那我们先假定最高的楼房位置确定,那么在其左边还有f-1个能看见,在其右边还有b-1个,能看见..所以可以这样将题目转化: 将除最高楼之外的n-1个楼,分成f-1+b-1 组,在最高楼左边f-1 组,在其右边b-1组,那么分成f-1+b-1 组 就是第一类Stirling数.s[n-1][f-1+b-1]..左边f-1 组

HDU4372-Count the Buildings(第一类Stirling数+组合计数)

Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 528    Accepted Submission(s): 171 Problem Description There are N buildings standing in a straight line in the City, numbere

HDU 3625 Examining the Rooms:第一类stirling数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625 题意: 有n个房间,每个房间里放着一把钥匙,对应能开1到n号房间的门. 除了1号门,你可以踹开任意一扇门(不用钥匙),但你最多只能踹k次. 问你能将所有门打开的概率. 题解: · P(打开所有门) = 能打开所有门的钥匙放置情况数 / 钥匙放置的总情况数 · 钥匙放置的总情况数 = n! 那么考虑下能打开所有门的钥匙放置情况数... 由于每个房间里有且只有一把钥匙,所以如果将每个房间连向房间内

Luogu4609 FJOI2016 建筑师 第一类Stirling数

题目传送门 题意:给出$N$个高度从$1$到$N$的建筑,问有多少种从左往右摆放这些建筑的方法,使得从左往右看能看到$A$个建筑,从右往左看能看到$B$个建筑.$N \leq 5 \times 10^4 , A,B \leq 100$ 第一次看到第一类$Stirling$数有用emmm 考虑将某种方案中最高的建筑拿出来,将分成的两半中可以看得见的与被它挡住的建筑分成一个部分,如下 绿色的当然是最高的,剩下的两个部分分成了1,2,3三个部分.可以知道我们总共需要$A+B-2$这样的部分,而其中$A

HDU 2643 Rank:第二类Stirling数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2643 题意: 有n个个选手参赛,问排名有多少种情况(可以并列). 题解: 简化问题: 将n个不同的元素放到i个有差别的盒子中,情况数为P(n,i),求∑P(n,i) (1<=i<=n) 再简化: 将n个不同的元素放到i个无差别的盒子中,情况数为S(n,i),求∑( S(n,i)*i! ) (1<=i<=n) 哇这是第二类Stirling数 ( ̄▽ ̄)~* 递推式:s(n,k) = s(

hdu 3625 Examining the Rooms —— 第一类斯特林数

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3625 学习斯特林数:https://blog.csdn.net/qq_33229466/article/details/75042895 https://www.cnblogs.com/gzy-cjoier/p/8426987.html http://www.cnblogs.com/zhouzhendong/p/Stirling-Number.html 关于这道题: 得到一把钥匙后,可以连续开的门与钥匙

HDOJ 题目4372 Count the Buildings(斯特林第一类数)

Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 738    Accepted Submission(s): 246 Problem Description There are N buildings standing in a straight line in the City, numbere