那这道题就相当于把
n
−
1
n-1
n−1个数分成了
A
+
B
−
2
A+B-2
A+B−2的圆排列,不过左边的
A
−
1
A-1
A−1个圆排列可以是任意挑出来的,所以乘上一个组合数。
a
n
s
=
s
[
n
−
1
]
[
A
+
B
−
2
]
∗
C
[
A
+
B
−
2
]
[
A
−
1
]
ans=s[n-1][A+B-2]*C[A+B-2][A-1]
ans=s[n−1][A+B−2]∗C[A+B−2][A−1]
#include<bits/stdc++.h>#define ll long longusingnamespace std;constint N =201;constint M =5e4+10;constint mod =1e9+7;int t, n, a, b;
ll s[M][N], c[N][N];intmain(){scanf("%d",&t);
s[0][0]=1;for(int i =1; i <= M -10;++i){for(int j =1; j <=min(N -1, i);++j) s[i][j]=(s[i -1][j]*(i -1)+ s[i -1][j -1])% mod;}
c[0][0]=1;for(int i =1; i <= N -1;++i){
c[i][0]=1;for(int j =1; j <=min(N -1, i);++j) c[i][j]=(c[i -1][j]+ c[i -1][j -1])% mod;}while(t--){scanf("%d%d%d",&n,&a,&b);if(a + b > n +1)printf("0\n");elseprintf("%lld\n", s[n -1][a + b -2]* c[a + b -2][a -1]% mod);}return0;}