#include <algorithm>
#include <bits/stdc++.h>
#include <cstdint>
#include <iostream>
#include <iterator>
#include <limits>
#include <stdexcept>
#include <vector>

// lib/quo.hpp
#ifndef QUO_H
#define QUO_H

/*
a == tools:quo(a, b) * b + tools::mod(a, b)
0 <= tools::mod(a, b) < std::abs(b)
*/

namespace tools {
  template <typename T>
  constexpr T quo(const T lhs, const T rhs) {
    return lhs > 0 ? lhs / rhs : rhs > 0 ? -((-lhs - 1 + rhs) / rhs) : (-lhs - 1 + -rhs) / -rhs;
  }
}

#endif

// lib/square.hpp
#ifndef SQUARE_HPP
#define SQUARE_HPP

/*
usage:

tools::square(5) => 25
*/

namespace tools {
  template <typename T>
  constexpr T square(const T x) {
    return x * x;
  }
}

#endif

// lib/is_prime.hpp
#ifndef IS_PRIME_H
#define IS_PRIME_H


/*
usage:

static_assert(tools::is_prime(P), "P must be prime.");
*/

// Source: Stack Overflow ( https://stackoverflow.com/questions/18303632/compile-time-prime-checking/18306693#18306693 )
// Author: Casey ( https://stackoverflow.com/users/923854/casey )
// CC BY-SA 3.0
namespace tools {
  namespace detail {
    namespace is_prime {
      constexpr std::uint_fast32_t mid(const std::uint_fast32_t low, const std::uint_fast32_t high) {
        return (low + high) / 2;
      }

      // precondition: low*low <= n, high*high > n.
      constexpr std::uint_fast32_t ceilsqrt(const std::uint_fast32_t n, const std::uint_fast32_t low, const std::uint_fast32_t high) {
        return low + 1 >= high
          ? high
          : (mid(low, high) * mid(low, high) == n)
          ? mid(low, high)
          : (mid(low, high) * mid(low, high) <  n)
          ? ceilsqrt(n, mid(low, high), high)
          : ceilsqrt(n, low, mid(low, high));
      }

      // returns ceiling(sqrt(n))
      constexpr std::uint_fast32_t ceilsqrt(const std::uint_fast32_t n) {
        return n < 3
          ? n
          : ceilsqrt(n, 1, std::uint_fast32_t(1) << (std::numeric_limits<std::uint_fast32_t>::digits / 2));
      }

      // returns true if n is divisible by an odd integer in
      // [2 * low + 1, 2 * high + 1).
      constexpr bool find_factor(const std::uint_fast32_t n, const std::uint_fast32_t low, const std::uint_fast32_t high) {
        return low + 1 >= high
          ? (n % (2 * low + 1)) == 0
          : (find_factor(n, low, mid(low, high)) || find_factor(n, mid(low, high), high));
      }
    }
  }

  constexpr bool is_prime(const std::uint_fast32_t n) {
    return n > 1
      && (n == 2
        || (n % 2 == 1
          && (n == 3
            || !detail::is_prime::find_factor(n, 1, (detail::is_prime::ceilsqrt(n) + 1) / 2))));
  }
}

#endif

// lib/util.hpp
#ifndef UTIL_HPP
#define UTIL_HPP


typedef std::int_fast64_t i64;
typedef std::uint_fast64_t u64;
typedef std::int_fast32_t i32;
typedef std::uint_fast32_t u32;

namespace tools {
  template <typename T>
  void read(std::vector<T>& vector, const typename std::vector<T>::size_type size) {
    vector.reserve(size);
    std::copy_n(std::istream_iterator<T>(std::cin), size, std::back_inserter(vector));
  }

  template <typename T, std::size_t N>
  void read(std::array<T, N>& array) {
    std::copy_n(std::istream_iterator<T>(std::cin), N, array.begin());
  }
}

#endif

// lib/mod.hpp
#ifndef MOD_HPP
#define MOD_HPP


/*
a == tools:quo(a, b) * b + tools::mod(a, b)
0 <= tools::mod(a, b) < std::abs(b)
*/

namespace tools {
  template <typename T>
  constexpr T mod(const T lhs, const T rhs) {
    return lhs - quo(lhs, rhs) * rhs;
  }
}

#endif

// lib/int_mod.hpp
#ifndef INT_MOD_HPP
#define INT_MOD_HPP


/*
usage:

constexpr const std::uint_fast32_t p = 3;
tools::int_mod<p>(5) + tools::int_mod<p>(4) // => 0
*/

namespace tools {
  template <std::uint_fast32_t P>
  class int_mod {
    static_assert(is_prime(P), "P must be prime.");

  private:
    std::uint_fast32_t m_value;

    constexpr static std::uint_fast32_t add_impl(const std::uint_fast32_t lhs, const std::uint_fast32_t rhs) {
      return lhs + rhs - (lhs + rhs >= P ? P : 0u);
    }

    constexpr static std::uint_fast32_t sub_impl(const std::uint_fast32_t lhs, const std::uint_fast32_t rhs) {
      return lhs - rhs + (lhs < rhs ? P : 0u);
    }

    constexpr static std::uint_fast32_t mul_impl(const std::uint_fast32_t lhs, const std::uint_fast32_t rhs) {
      return static_cast<std::uint_fast32_t>(static_cast<std::uint_fast64_t>(lhs) * static_cast<std::uint_fast64_t>(rhs) % static_cast<std::uint_fast64_t>(P));
    }

    constexpr int_mod<P> pow_impl(const std::uint_fast32_t exponent) const {
      return exponent == 0u
        ? int_mod<P>(1)
        : exponent % 2u == 0u
          ? square(this->pow_impl(exponent / 2u))
          : this->pow_impl(exponent - 1u) * *this;
    }

  public:
    int_mod() :
      m_value(0) {
    }

    int_mod(const std::int_fast32_t value) :
      m_value(static_cast<std::uint_fast32_t>(mod(value, static_cast<std::int_fast32_t>(P)))) {
    }

    int_mod(const int_mod<P>& other) :
      int_mod(other.m_value) {
    }

    constexpr operator std::uint_fast32_t() const {
      return this->m_value;
    }

    constexpr friend int_mod<P> operator+(const int_mod<P>& lhs, const int_mod<P>& rhs) {
      return int_mod<P>(int_mod<P>::add_impl(lhs.m_value, rhs.m_value));
    }

    int_mod<P>& operator+=(const int_mod<P>& other) {
      this->m_value = int_mod<P>::add_impl(this->m_value, other.m_value);
      return *this;
    }

    int_mod<P>& operator++() {
      this->m_value = int_mod<P>::add_impl(this->m_value, 1u);
      return *this;
    }

    int_mod<P> operator++(int) {
      int_mod<P> prev(*this);
      ++this;
      return prev;
    }

    constexpr friend int_mod<P> operator-(const int_mod<P>& lhs, const int_mod<P>& rhs) {
      return int_mod<P>(int_mod<P>::sub_impl(lhs.m_value, rhs.m_value));
    }

    int_mod<P>& operator-=(const int_mod<P>& other) {
      this->m_value = int_mod<P>::sub_impl(this->m_value, other.m_value);
      return *this;
    }

    int_mod<P>& operator--() {
      this->m_value = int_mod<P>::sub_impl(this->m_value, 1u);
      return *this;
    }

    int_mod<P> operator--(int) {
      int_mod<P> prev(*this);
      --this;
      return prev;
    }

    constexpr friend int_mod<P> operator*(const int_mod<P>& lhs, const int_mod<P>& rhs) {
      return int_mod<P>(int_mod<P>::mul_impl(lhs.m_value, rhs.m_value));
    }

    int_mod<P>& operator*=(const int_mod<P>& other) {
      this->m_value = int_mod<P>::mul_impl(this->m_value, other.m_value);
      return *this;
    }

    constexpr int_mod<P> inv() const {
      return this->m_value > 0u
        ? this->pow_impl(P - 2u)
        : (throw std::invalid_argument("cannot divide by zero"));
    }

    constexpr int_mod<P> pow(const std::int_fast32_t exponent) const {
      return exponent >= 0
        ? this->pow_impl(static_cast<std::uint_fast32_t>(exponent))
        : this->pow_impl(static_cast<std::uint_fast32_t>(-exponent)).inv();
    }

    constexpr friend int_mod<P> operator/(const int_mod<P>& lhs, const int_mod<P>& rhs) {
      return lhs * rhs.inv();
    }

    int_mod<P>& operator/=(const int_mod<P>& other) {
      this->m_value = int_mod<P>::mul_impl(this->m_value, other.inv().m_value);
      return *this;
    }
  };
}

#endif

// main.cpp

std::vector<std::vector<bool>> calc_swap_patterns(const i64 W) {
  std::vector<std::vector<bool>> swap_patterns;
  swap_patterns.emplace_back(W - 1, false);
  for (i64 i = 0; i <= W - 2; ++i) {
    std::vector<bool> swap_pattern(W - 1, false);
    swap_pattern[i] = true;
    swap_patterns.push_back(swap_pattern);
  }
  for (i64 i = 0; i <= W - 4; ++i) {
    for (i64 j = i + 2; j <= W - 2; ++j) {
      std::vector<bool> swap_pattern(W - 1, false);
      swap_pattern[i] = true;
      swap_pattern[j] = true;
      swap_patterns.push_back(swap_pattern);
    }
  }
  for (i64 i = 0; i <= W - 6; ++i) {
    for (i64 j = i + 2; j <= W - 4; ++j) {
      for (i64 k = j + 2; k <= W - 2; ++k) {
        std::vector<bool> swap_pattern(W - 1, false);
        swap_pattern[i] = true;
        swap_pattern[j] = true;
        swap_pattern[k] = true;
        swap_patterns.push_back(swap_pattern);
      }
    }
  }
  for (i64 i = 0; i <= W - 8; ++i) {
    for (i64 j = i + 2; j <= W - 6; ++j) {
      for (i64 k = j + 2; k <= W - 4; ++k) {
        for (i64 l = k + 2; l <= W - 2; ++l) {
          std::vector<bool> swap_pattern(W - 1, false);
          swap_pattern[i] = true;
          swap_pattern[j] = true;
          swap_pattern[k] = true;
          swap_pattern[l] = true;
          swap_patterns.push_back(swap_pattern);
        }
      }
    }
  }
  return swap_patterns;
}

constexpr u32 P = 1000000007;

class swap_pattern_count {
public:
  tools::int_mod<P> to_left;
  tools::int_mod<P> go_straight;
  tools::int_mod<P> to_right;
};

std::vector<swap_pattern_count> calc_swap_pattern_counts(const i64 W) {
  std::vector<swap_pattern_count> swap_pattern_counts(W);

  for (const std::vector<bool>& swap_pattern : calc_swap_patterns(W)) {
    for (i64 x = 0; x < W; ++x) {
      const bool has_left_line = x > 0 && swap_pattern[x - 1];
      const bool has_right_line = x < W - 1 && swap_pattern[x];
      if (has_left_line) {
        ++swap_pattern_counts[x].to_left;
      } else if (has_right_line) {
        ++swap_pattern_counts[x].to_right;
      } else {
        ++swap_pattern_counts[x].go_straight;
      }
    }
  }

  return swap_pattern_counts;
}

int main() {
  i64 H, W, K;
  std::cin >> H >> W >> K;
  --K;

  std::vector<std::vector<tools::int_mod<P>>> dp(H + 1, std::vector<tools::int_mod<P>>(W));
  dp[0][0] = tools::int_mod<P>(1);

  const std::vector<swap_pattern_count> swap_pattern_counts = calc_swap_pattern_counts(W);

  for (i64 y = 0; y < H; ++y) {
    for (i64 x = 0; x < W; ++x) {
      if (x > 0) dp[y + 1][x - 1] += dp[y][x] * swap_pattern_counts[x].to_left;
      dp[y + 1][x] += dp[y][x] * swap_pattern_counts[x].go_straight;
      if (x < W - 1) dp[y + 1][x + 1] += dp[y][x] * swap_pattern_counts[x].to_right;
    }
  }

  std::cout << static_cast<u32>(dp[H][K]) << std::endl;
  return 0;
}

Measured memory_bytes: 256