// Cheese-Cracker: cheese-cracker.github.io

const ll PRIME = 10^^9 + 7;

void play(){
    ll n, x, pos;
    n = rd; x = rd; pos = rd;
    ll clo = x-1, chi = n - x;
    ll res = 1;
    int lo = 0, hi = n.to!int;
    while(lo < hi){
        int midd = (lo + hi)/2;
        show(midd, pos, clo, chi);
        if(midd <= pos){
            if(pos != midd){
                res *= clo;
                res %= PRIME;
                --clo;
            }
            lo = midd + 1;
        }else{
            res *= chi;
            res %= PRIME;
            --chi;
            hi = midd;
        }
    }
    assert(lo - 1 == pos);
    ll left = chi + clo;
    show(left);
    foreach(i; 1..left+1){
        res *= i;
        res %= PRIME;
    }
    writeln(res);
}

int main(){
    long t = 1;
    /* t = rd;        // Toggle! */
    while(t--) play();  // Let's play!
    stdout.flush;
    return 0;
}

/**********It's A Me Mario!**********/
import std.stdio, std.conv, std.functional, std.string, std.algorithm;
import std.container, std.range, std.typecons, std.numeric, std.math, std.random;
static string[] inp;
T rd(T = long)(){while(!inp.length) inp = readln.chomp.split; string a = inp[0]; inp.popFront; return a.to!T;}
T[] rdarr(T = long)(){ auto r = readln.chomp.split.to!(T[]); return r; }
void show(A...)(A a) { debug{ foreach(t; a){ write(t, "| "); } writeln; } }
alias ll = long;
alias rbt = redBlackTree;
alias tup = Tuple!(long, "x",  long, "y");
T max(T = long)(T a, T b){ return (a > b) ? a : b; }
T min(T = long)(T a, T b){ return (a < b) ? a : b; }
