分析
显然左边看到的是前缀 $\max$,右边看到的是后缀 $\max$,而最大值前后都能看到。
除去最大的,剩下的 $n-1$ 个数需要划分成 $A+B-2$ 个圆排列(圆排列的原因是因为我们需要钦定最大的放在某个端点);然后这 $A+B-2$ 个前后缀 $\max$ 中需要选出 $A-1$ 个放在左边。
于是答案为
$$
\begin{bmatrix}n-1\\A+B-2\end{bmatrix}\times{A+B-2\choose A-1}
$$
代码
// ===================================
// author: M_sea
// website: http://m-sea-blog.com/
// ===================================
#include <bits/stdc++.h>
#define re register
using namespace std;
inline int read() {
int X=0,w=1; char c=getchar();
while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
while (c>='0'&&c<='9') X=X*10+c-'0',c=getchar();
return X*w;
}
const int N=50000+10,L=200+10;
const int mod=1e9+7;
int S[N][L],C[L][L];
int main() {
for (re int i=S[0][0]=1;i<N;++i)
for (re int j=1;j<L;++j)
S[i][j]=(S[i-1][j-1]+1ll*(i-1)*S[i-1][j])%mod;
for (re int i=C[0][0]=1;i<L;++i)
for (re int j=C[i][0]=1;j<L;++j)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
int T=read();
while (T--) {
int n=read(),A=read(),B=read();
printf("%lld\n",1ll*S[n-1][A+B-2]*C[A+B-2][A-1]%mod);
}
return 0;
}