题目
题目描述
小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
1⩽n⩽10
对于
20
%
20\%
20%的数据:
1
⩽
n
⩽
100
1 \leqslant n \leqslant 100
1⩽n⩽100
对于
40
%
40\%
40%的数据:
1
⩽
n
⩽
50000
,
1
⩽
T
⩽
5
1 \leqslant n \leqslant 50000, 1 \leqslant T \leqslant 5
1⩽n⩽50000,1⩽T⩽5
对于
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
1⩽n⩽50000,1⩽A,B⩽100, 1⩽T⩽200000
题解
显然,这个建筑群一定会呈现这个样子:
其中,红色的代表一栋建筑,黑色的框代表一个建筑块(???),填充为红色的建筑高为
n
n
n
去掉这个最高的建筑,剩下的建筑就一定被分成了
A
+
B
−
2
A+B-2
A+B−2个块,其中左边有
A
−
1
A-1
A−1个,右边有
B
−
1
B-1
B−1个
这是因为每个建筑块有且仅有一个建筑能被看见(这是显然的吧……感性理解一下)
研究一下每一个建筑块会发现,对于一个一共有
k
k
k个建筑的建筑块,当最高的建筑已经被选出时,这个建筑块一共有
(
k
−
1
)
!
(k-1)!
(k−1)!种方案
这让我们想到了单独一个环的排列也是
(
k
−
1
)
!
(k-1)!
(k−1)!种!
所以这岂不是第一类斯特林数?(不会斯特林数的戳这里)
最后,我们就会知道,答案是
(
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}
(A−1A+B−2)[n−1A+B−2]
附上代码:
#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;
}