Luogu

LOJ

分析

显然左边看到的是前缀 $\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;
}
最后修改:2021 年 03 月 24 日 03 : 00 PM