#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << "[ " << *it << " = " << a << " ] ";
  err(++it, args...);
}
template <typename Tk, typename Tv>
ostream& operator<<(ostream& os, const pair<Tk, Tv>& p) {
  os << "{" << p.first << ',' << p.second << "}";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& p) {
  os << "[ ";
  for (T x : p) os << x << " ";
  os << "]" << '\n';
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& p) {
  os << "{ ";
  for (T x : p) os << x << " ";
  os << "}" << '\n';
  return os;
}
template <typename Tk, typename Tv>
ostream& operator<<(ostream& os, const map<Tk, Tv>& p) {
  os << "{ ";
  for (pair<Tk, Tv> x : p) os << x << " ";
  os << "}" << '\n';
  return os;
}
long long int facto(long long int n) {
  long long int res = 1;
  for (long long int i = 2; i <= n; i++) {
    res = (res * i) % (long long int)(1e9 + 7);
    res %= (long long int)(1e9 + 7);
  }
  return res % (long long int)(1e9 + 7);
}
long long int inv_mod(long long int a) {
  long long int res = 1;
  long long int mod_temp = (long long int)(1e9 + 7) - 2;
  while (mod_temp) {
    if (mod_temp & 1) {
      res =
          ((res % (long long int)(1e9 + 7)) * (a % (long long int)(1e9 + 7))) %
          (long long int)(1e9 + 7);
    }
    a = ((a % (long long int)(1e9 + 7)) * (a % (long long int)(1e9 + 7))) %
        (long long int)(1e9 + 7);
    mod_temp >>= 1;
  }
  return res % (long long int)(1e9 + 7);
}
vector<long long int> fact(1, 1);
vector<long long int> inv_fact(1, 1);
long long int ncr(long long int n, long long int k) {
  if (k < 0 || k > n) {
    return 0;
  }
  while ((long long int)fact.size() < n + 1) {
    long long int val = fact.back() * (long long int)fact.size();
    val %= (long long int)(1e9 + 7);
    fact.push_back(val);
    inv_fact.push_back(inv_mod(fact.back()));
  }
  long long int ans = fact[n] * inv_fact[k];
  ans %= (long long int)(1e9 + 7);
  ans *= inv_fact[n - k];
  ans %= (long long int)(1e9 + 7);
  return ans;
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long int n, x, pos;
  cin >> n >> x >> pos;
  long long int fix_g = 0, fix_l = 0;
  long long int l = 0, r = n;
  while (l < r) {
    long long int md = (l + r) / 2;
    if (md <= pos) {
      if (md != pos) fix_l++;
      l = md + 1;
    } else if (pos < md) {
      r = md;
      fix_g++;
    }
  }
  long long int ans = 1;
  long long int less = x - 1, more = n - x;
  n -= fix_l + fix_g + 1;
  ans *= ncr(more, fix_g);
  ans *= ncr(less, fix_l);
  ans %= (long long int)(1e9 + 7);
  long long int tmp = facto(fix_g);
  ans = (ans * tmp % (long long int)(1e9 + 7)) % (long long int)(1e9 + 7);
  tmp = facto(fix_l);
  ans = (ans * tmp % (long long int)(1e9 + 7)) % (long long int)(1e9 + 7);
  ans = (ans * facto(n) % (long long int)(1e9 + 7)) % (long long int)(1e9 + 7);
  cout << ans << '\n';
  return 0;
}
