洛谷P4609 [FJOI2016]建筑师

题目

题目描述

Z是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 nnn 个建筑,每个建筑的高度是 1 1 1 n n n之间的一个整数
Z有很严重的强迫症,他不喜欢有两个建筑的高度相同
另外小Z觉得如果从最左边(所有建筑都在右边)看能看到 A A A个建筑,从最右边(所有建筑都在左边)看能看到 B B B个建筑,这样的建筑群有着独特的美感
现在,小Z想知道满足上述所有条件的建筑方案有多少种
如果建筑 i i i的左(右)边没有任何建造比它高,则建筑 i i i可以从左(右)边看到
两种方案不同,当且仅当存在某个建筑在两种方案下的高度不同

输入格式

第一行一个整数 T T T,代表 T T T组数据
接下来 T T T行,每行三个整数 n , A , B n,A,B n,A,B

输出格式

对于每组数据输出一行答案 mod  1 0 9 + 7 \text{mod } 10^9+7 mod 109+7

样例

样例输入

2
3 2 2
3 1 2

样例输出

2
1

数据范围与提示

对于 10 % 10\% 10%的数据: 1 ⩽ n ⩽ 10 1 \leqslant n \leqslant 10 1n10
对于 20 % 20\% 20%的数据: 1 ⩽ n ⩽ 100 1 \leqslant n \leqslant 100 1n100
对于 40 % 40\% 40%的数据: 1 ⩽ n ⩽ 50000 , 1 ⩽ T ⩽ 5 1 \leqslant n \leqslant 50000, 1 \leqslant T \leqslant 5 1n50000,1T5
对于 100 % 100\% 100%的数据: 1 ⩽ n ⩽ 50000 , 1 ⩽ A , B ⩽ 100 ,   1 ⩽ T ⩽ 200000 1 \leqslant n \leqslant 50000, 1 \leqslant A, B \leqslant 100, \ 1 \leqslant T \leqslant 200000 1n50000,1A,B100, 1T200000

题解

显然,这个建筑群一定会呈现这个样子:
建筑其中,红色的代表一栋建筑,黑色的框代表一个建筑块(???),填充为红色的建筑高为 n n n
去掉这个最高的建筑,剩下的建筑就一定被分成了 A + B − 2 A+B-2 A+B2个块,其中左边有 A − 1 A-1 A1个,右边有 B − 1 B-1 B1
这是因为每个建筑块有且仅有一个建筑能被看见(这是显然的吧……感性理解一下)
研究一下每一个建筑块会发现,对于一个一共有 k k k个建筑的建筑块,当最高的建筑已经被选出时,这个建筑块一共有 ( k − 1 ) ! (k-1)! (k1)!种方案
这让我们想到了单独一个环的排列也是 ( k − 1 ) ! (k-1)! (k1)!种!
所以这岂不是第一类斯特林数?(不会斯特林数的戳这里
最后,我们就会知道,答案是 ( A + B − 2 A − 1 ) [ n − 1 A + B − 2 ] \binom{A+B-2}{A-1}\begin{bmatrix}n-1\\A+B-2\end{bmatrix} (A1A+B2)[n1A+B2]
附上代码:

#include<iostream>
using namespace std;
int n,a,b,MOD=1e9+7,s[50010][210],c[210][210];
int main()
{
    s[0][0]=c[0][0]=1;
    for(int i=1;i<=50000;i++) for(int j=1;j<=min(i,200);j++) s[i][j]=(1ll*s[i-1][j]*(i-1)%MOD+s[i-1][j-1])%MOD;
    for(int i=1;i<=200;i++){
        c[i][0]=c[i][i]=1;
        for(int j=1;j<i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;
    }
    int T;
    cin>>T;
	while(T--) cin>>n>>a>>b,cout<<1ll*s[n-1][a+b-2]*c[a+b-2][a-1]%MOD<<endl;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值