#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <set>
#include <queue>
#include <stack>
#include <tuple>
#include <cmath>
#include <iomanip>
#include <map>
#include <stdio.h>
#include <cstring> //memset(dp,0,sizeof(dp))
#include <functional>
#define ll long long
#define rep(i,n) for(int i=0;i<(n);i++)
#define rrep(i,n) for(int i=n-1;i>=0;i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(),(a).end()
using namespace std;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
typedef pair<int,int> P;
typedef pair<ll,ll> Pll;
//小数点以下　cout << fixed << setprecision(10) << num << endl;
//桁数はlog10(mid)でやれ　log(mid)/log(10)はWA
//long*long<0で判定するな
//開区間と閉区間
//アルファベットが何番目かは x=s[i]-'a'
//bfsはmain()内で　rep(i,h)rep(j,w)rep(i,4)でバグ
//切り上げ：(a+(b-1))/b
//32bit以上は 1ull<<j
// map 初期値0 for(auto itr=mp.begin();itr!=mp.end();++itr) itr->fi itr->se で全探索
// for(auto u:mp) u.fi u.se も可能
//n個のgcd,lcmは一つずつみて更新していく
//大きな数を扱うときは素因数分解した形で持っておく
// (l/a[i]) = l*powmod(a[i],MOD-2)%MOD;
//auto itr=lower_bound(ALL(a),key) a[itr-a.begin()]
const ll MOD = 1000000007;
signed main(){
    int h,w,k;
    cin >> h >> w >> k;
    k--;
    if(w==1){
        if(k==0) cout << 1 << endl;
        else cout << 0 << endl;
        return 0;
    }
    ll num[w-1],no[w];
    
    rep(i,w-1) num[i]=0;
    rep(i,w) no[i]=0;
    
    rep(i,(1<<(w-1))){
        bool kuji[w-1];
        rep(j,w-1){
            if(i&(1<<j)){
                kuji[j]=1;
            }else kuji[j]=0;
        }
        bool aa=0;
        rep(j,w-2) if(kuji[j]&&kuji[j+1]) aa=1;
        if(aa) continue;
        rep(j,w-1){
            if(kuji[j]) num[j]++;
            if(0<j&&!kuji[j]&&!kuji[j-1]) no[j]++;
        }
        if(!kuji[0]) no[0]++;
        if(!kuji[w-2]) no[w-1]++;
    }
    ll dp[h+1][w];
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    rep(i,h+1){
        if(i==0) continue;
        rep(j,w){
            if(j>0) dp[i][j]+=(dp[i-1][j-1]*num[j-1])%MOD;
            dp[i][j]%=MOD;
            if(j+1<w) dp[i][j]+=(dp[i-1][j+1]*num[j])%MOD;
            dp[i][j]%=MOD;
            dp[i][j]+=(dp[i-1][j]*no[j])%MOD;
            dp[i][j]%=MOD;
        }
    }
    cout << dp[h][k] << endl;
}

/*
これを入れて実行
g++ code.cpp
./a.out
 */
 
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <deque>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <unordered_map>
#include <cmath>
#include <math.h>
#include <tuple>
#include <iomanip>
#include <bitset>
#include <functional>

#define all(x) (x).begin(),(x).end()
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
 
using namespace std;
typedef long long ll;
typedef long double ld;
 
int dy4[4] = {-1, 0, +1, 0};
int dx4[4] = {0, +1, 0, -1};
int dy8[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dx8[8] = {0, 1, 1, 1, 0, -1, -1, -1};
 
const long long INF = 1LL << 62;
const ll MOD = 1e9 + 7;
 
bool greaterSecond(const pair<int, int>& f, const pair<int, int>& s){
    return f.second > s.second;
}
 
ll gcd(ll a, ll b){
	if (b == 0)return a;
	return gcd(b, a % b);
}
 
ll lcm(ll a, ll b){
    return a / gcd(a, b) * b;
}
 
ll nCr(ll n, ll r){
    if(r == 0 || r == n){
        return 1;
    } else if(r == 1){
        return n;
    }
    return (nCr(n - 1, r) + nCr(n - 1, r - 1));
}
 
ll nPr(ll n, ll r){
    r = n - r;
    ll ret = 1;
    for (ll i = n; i >= r + 1; i--) ret *= i;
    return ret;
}
 
//-----------------------ここから-----------
ll h, w, k;
ll memo[110][10];

ll rec(ll i, ll j){
    if(i == 0 && j == 0) return 1;
    if(i == 0) return 0;
    if(memo[i][j] != -1) return memo[i][j];
    ll res = 0;
    //cout << i << " " << j << endl;
    for(ll bit = 0; bit < (1LL << (w - 1)); bit++){
        bool ok = true;
        for(ll ii = 0; ii < w - 2; ii++){
            if((bit & (1LL << ii)) && (bit & (1LL << (ii + 1)))){
                ok = false;
                break;
            }
        }
        if(ok){
            if(bit & (1LL << j) && j + 1 < w){
                res += rec(i - 1, j + 1);
            } else if(bit & (1 << (j - 1)) && j - 1 >= 0){
                res += rec(i - 1, j - 1);
            } else {
                res += rec(i - 1, j);
            }
            res %= MOD;
        }
    }
    return memo[i][j] = res;

}
int main(void){

    cin >> h >> w >> k;
    
    rep(i, 110) rep(j, 10) memo[i][j] = -1;
    cout << rec(h, k - 1) % MOD << endl;

}