#include <bits/stdc++.h>

using namespace std;

#define FOR(i, a, b) for(ll i = (a); i < (b); ++i)
#define FORR(i, a, b) for(ll i = (a); i > (b); --i)
#define REP(i, n) for(ll i = 0; i < (n); ++i)
#define REPR(i, n) for(ll i = n; i >= 0; i--)
#define FOREACH(x, a) for(auto &(x) : (a))
#define VECCIN(x)                                                              \
    for(auto &youso_ : (x)) cin >> youso_
#define mp make_pair
#define bitcnt __builtin_popcount
#define SZ(x) ((ll)(x).size())
#define All(a) (a).begin(), (a).end()
template <typename T = long long> inline T IN() {
    T x;
    cin >> x;
    return (x);
}
inline void CIN() {}
template <class Head, class... Tail>
inline void CIN(Head &&head, Tail &&... tail) {
    cin >> head;
    CIN(move(tail)...);
}
#define CINT(...)                                                              \
    int __VA_ARGS__;                                                           \
    CIN(__VA_ARGS__)
#define LCIN(...)                                                              \
    ll __VA_ARGS__;                                                            \
    CIN(__VA_ARGS__)
#define SCIN(...)                                                              \
    string __VA_ARGS__;                                                        \
    CIN(__VA_ARGS__)
#define Yes(a) cout << (a ? "Yes" : "No") << "\n"
#define YES(a) cout << (a ? "YES" : "NO") << "\n"
#define Printv(v)                                                              \
    {                                                                          \
        FOREACH(x, v) { cout << x << " "; }                                    \
        cout << "\n";                                                          \
    }

typedef long long ll;
typedef unsigned long long ul;
typedef vector<ll> VL;
typedef pair<ll, ll> PL;
typedef priority_queue<ll> PQ;
typedef priority_queue<ll, VL, greater<ll>> PQG;

const int INF = 1e9;
const int MOD = 1e9 + 7;
// const int MOD = 998244353;
const ll LINF = 1e18;
const ll dx[] = {1, -1, 0, 0};
const ll dy[] = {0, 0, 1, -1};

ll H, W, K;
ll fib[1000000];

void fibinit() {
    fib[0] = 1;
    fib[1] = 1;
    for(int i = 2; i < 1000; ++i) {
        fib[i] = (fib[i - 1] + fib[i - 2]) % MOD;
    }
    return;
}

// 正方行列の積
vector<VL> matmul(vector<VL> a, vector<VL> b) {
    ll len = a[0].size();
    vector<VL> ret(len, VL(len, 0));
    REP(i, len) REP(j, len) REP(k, len) {
        ret[i][j] += a[i][k] * b[k][j];
        ret[i][j] %= MOD;
    }
    return ret;
}

vector<VL> matpow(vector<VL> m, ll n) {
    ll len = m[0].size();
    if(n == 0) {
        REP(i, len) REP(j, len) { m[i][j] = (i == j); }
        return m;
    }
    auto res = matpow(matmul(m, m), n / 2);
    if(n & 1) res = matmul(m, res);
    return res;
}

int main() {
    cin >> H >> W >> K;
    fibinit();
    vector<VL> M(W, VL(W, 0));
    REP(i, W) {
        M[i][i] = fib[i] * fib[W - i - 1] % MOD;
        if(i > 0) {
            M[i - 1][i] = fib[i - 1] * fib[W - i - 1] % MOD;
        }
        if(i < W - 1) {
            M[i + 1][i] = fib[i] * fib[W - i - 2] % MOD;
        }
    }
    auto res = matpow(M, H);
    cout << res[K - 1][0] << "\n";
    return 0;
}

Measured memory_bytes: 256