#include <bits/stdc++.h>
using namespace std;
const long long int MAX_SIZE = 1000001;
long long int power(long long int x, long long int y) {
  long long int res = 1;
  while (y > 0) {
    if (y & 1) res = res * x;
    y = y >> 1;
    x = x * x;
  }
  return res;
}
long long int powermod(long long int x, long long int y, long long int p) {
  long long int res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
long long int imod(long long int a, long long int m) {
  return powermod(a, m - 2, m);
}
unsigned long long int aModM(string s, unsigned long long int mod) {
  unsigned long long int number = 0;
  for (unsigned long long int i = 0; i < s.length(); i++) {
    number = (number * 10 + (s[i] - '0'));
    number %= mod;
  }
  return number;
}
long long int gcd(long long int a, long long int b) {
  if (a == 0 || b == 0) return a + b;
  if (a > b)
    return gcd(a % b, b);
  else
    return gcd(a, b % a);
}
vector<long long int> fact;
void factorial(long long int n) {
  fact.push_back(1);
  fact.push_back(1);
  for (long long int i = 2; i <= n; i++)
    fact.push_back((fact[i - 1] * i) % 1000000007);
}
struct Node {
  long long int data;
  Node *left;
  Node *right;
};
Node *newNode(long long int data) {
  Node *temp = new Node;
  temp->data = data;
  temp->right = temp->left = NULL;
  return temp;
}
void printInorder(Node *node) {
  if (node == NULL) return;
  printInorder(node->left);
  cout << node->data << " ";
  printInorder(node->right);
}
void printLevelOrder(Node *root) {
  if (root == NULL) return;
  queue<Node *> q;
  q.push(root);
  long long int lvl = 1;
  while (!q.empty()) {
    long long int nodeCount = q.size();
    while (nodeCount > 0) {
      Node *node = q.front();
      cout << node->data << " ";
      q.pop();
      if (node->left != NULL) q.push(node->left);
      if (node->right != NULL) q.push(node->right);
      nodeCount--;
    }
    lvl++;
    cout << " ";
  }
}
void myfun() {
  factorial(1000);
  long long int n, val, pos;
  cin >> n >> val >> pos;
  long long int left = 0;
  long long int right = n;
  long long int lcount = 0;
  long long int rcount = 0;
  while (left < right) {
    long long int middle = (left + right) / 2;
    if (middle == pos) {
      left = middle + 1;
    } else if (middle < pos) {
      lcount++;
      left = middle + 1;
    } else {
      rcount++;
      right = middle;
    }
  }
  long long int b = n - val;
  long long int s = val - 1;
  if (s >= lcount && b >= rcount) {
    long long int total = fact[n - lcount - rcount - 1];
    total = (total * imod(fact[b - rcount], 1000000007)) % 1000000007;
    total = (total * imod(fact[s - lcount], 1000000007)) % 1000000007;
    total = (total * fact[b]) % 1000000007;
    total = (total * fact[s]) % 1000000007;
    cout << total << "\n";
  } else {
    cout << 0 << "\n";
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long int t = 1;
  while (t--) myfun();
}
