// #pragma GCC target ("avx2")
// #pragma GCC optimize ("O3")
// #pragma GCC optimize ("unroll-loops")
// #include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#include <iomanip>
#include <string>
#include <queue>
#include <set>
#include <deque>
#include <numeric>
#include <stack>
using namespace std;
#define int long long
#define endl "\n"
int dp[2005][2005][3];
const int M = 1e9 + 7;
// c++ o
// c x
// c-- o
void solve() {
int n, s, t; cin >> n >> s >> t;
if (s == 1 or t == 1) dp[1][1][1] = 1;
else dp[1][1][0] = 1;
for (int i = 1; i < n; i++){
for (int j = 1; j <= i; j++){
if (i + 1 == s or i + 1 == t){
dp[i + 1][j + 1][1] += dp[i][j][0];
dp[i + 1][j + 1][1] %= M;
dp[i + 1][j][1] += dp[i][j][0];
dp[i + 1][j][1] %= M;
dp[i + 1][j + 1][2] += dp[i][j][1];
dp[i + 1][j + 1][2] %= M;
dp[i + 1][j][2] += dp[i][j][1];
dp[i + 1][j][2] %= M;
}
else {
dp[i + 1][j + 1][0] += dp[i][j][0] * (j + 1);
dp[i + 1][j + 1][0] %= M;
dp[i + 1][j + 1][1] += dp[i][j][1] * (j);
dp[i + 1][j + 1][1] %= M;
dp[i + 1][j + 1][2] += dp[i][j][2] * (j - 1);
dp[i + 1][j + 1][2] %= M;
dp[i + 1][j - 1][0] += dp[i][j][0] * (j - 1);
dp[i + 1][j - 1][0] %= M;
dp[i + 1][j - 1][1] += dp[i][j][1] * (j - 1);
dp[i + 1][j - 1][1] %= M;
dp[i + 1][j - 1][2] += dp[i][j][2] * (j - 1);
dp[i + 1][j - 1][2] %= M;
}
}
}
cout << dp[n][1][2] << endl;
return;
}
signed main() {
// freopen("", "r", stdin);
// freopen("", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cout << setprecision(9);
srand(time(0));
int tc = 1;
// cin >> tc;
while (tc--) {
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |