#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int MOD = 1e9 + 7;
int M, X, N;
vector<vector<int> > dp[MAXN][2];
int solve(int atual, int jatem, int abertos, int falta) {
  if (atual > X && jatem == 0) return 0;
  if (falta < 0 || abertos < 0) return 0;
  if (dp[atual][jatem][abertos][falta] != -1)
    return dp[atual][jatem][abertos][falta];
  if (atual == M + 1) {
    if (abertos == 0 && falta == 0)
      return dp[atual][jatem][abertos][falta] = 1;
    else
      return dp[atual][jatem][abertos][falta] = 0;
  }
  int njatem = (jatem | (atual == X));
  if (abertos == 0) {
    int ans = solve(atual + 1, njatem, abertos, falta - 1);
    ans += solve(atual + 1, njatem, abertos + 1, falta - 1);
    ans %= MOD;
    ans += solve(atual + 1, jatem, abertos, falta);
    ans %= MOD;
    return dp[atual][jatem][abertos][falta] = ans;
  } else {
    int ans = solve(atual + 1, njatem, abertos + 1, falta - 1);
    ans += solve(atual + 1, njatem, abertos, falta - 1);
    ans %= MOD;
    ans += solve(atual + 1, jatem, abertos - 1, falta);
    ans %= MOD;
    ans += solve(atual + 1, jatem, abertos, falta);
    ans %= MOD;
    return dp[atual][jatem][abertos][falta] = ans;
  }
}
int main() {
  cin >> N >> M >> X;
  if (N > M) {
    cout << 0 << endl;
    return 0;
  }
  vector<int> dimensao_1;
  dimensao_1.assign(N + 2, -1);
  vector<vector<int> > dimensao_2;
  dimensao_2.assign(N + 2, dimensao_1);
  for (int i = 1; i <= M + 1; i++) {
    if (i <= X) dp[i][0] = dimensao_2;
    if (i >= X) dp[i][1] = dimensao_2;
  }
  long long comeco = (long long)solve(1, 0, 0, N);
  for (long long i = 2; i <= N; i++) {
    comeco *= i;
    comeco %= MOD;
  }
  cout << comeco << endl;
  return 0;
}
