代码是这样的
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include<ext/pb_ds/trie_policy.hpp>
#include<ext/pb_ds/priority_queue.hpp>
#include<ext/rope>
#define pn putchar('\n')
#define ps putchar(' ')
using namespace __gnu_cxx;
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
template <typename T> void re(T &t) {
t=0;
char ch=getchar();
int f=1;
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
do {
(t*=10)+=ch-'0';
ch=getchar();
} while ('0'<=ch&&ch<='9');
t*=f;
}
inline void wr(int x) {
if(x<0) x=-x;
if(x>9) wr(x/10);
putchar(x%10+'0');
}
const long long MOD = 1000000007;
ll f[2100][2100];
int n,s,t;
int main(){
re(n);re(s);re(t);
f[1][1] = 1;
for (int i = 2; i <= n; i++)
for (int j = 1; j <= n; j++)
if ((i == s) || (i == t)){
f[i][j] += f[i - 1][j - 1] + f[i - 1][j];
f[i][j] %= MOD;
}
else{
f[i][j] += f[i - 1][j + 1] * j;
f[i][j] %= MOD;
int num = 0;
if (i > s)
num++;
if (i > t)
num++;
f[i][j] += f[i - 1][j - 1] * (j - num);
f[i][j] %= MOD;
}
wr(f[n][1]);
return 0;
}