{-# LANGUAGE BangPatterns #-}

import Data.Bits
import Data.List
import Data.IntMap.Strict (IntMap)
import qualified Data.IntMap.Strict as IntMap
import qualified Data.ByteString.Char8 as B
import Control.Monad
import Control.Applicative
import Data.Maybe
import qualified Data.IntMap.Strict as M
import qualified Data.ByteString.Char8 as B
import qualified Data.Vector.Unboxed as V
-- import Data.Vector.Unboxed ((!))
import Data.Tuple
import Data.Ord (Down(..))
import Data.Coerce

-- lines are 1,2.. width

fibs :: V.Vector Int
fibs = V.unfoldrN 12 (\(x,y) -> Just (y, (y,x+y))) (0,1)

amidas :: Int -> Int
amidas width = fibs V.! width


-- 1 <= left < width
amidasWithLine :: Int -> Int -> Int
amidasWithLine width left
  = amidas (left - 1) * amidas (width - left - 1)

amidasWithoutLine :: Int -> Int -> Int
amidasWithoutLine width at
  = amidas (at - 1) * amidas (width - at)

modulus :: Int
modulus = 1000000007

update :: Int -> V.Vector Int -> V.Vector Int
update width vec
  = V.izipWith3
      (\i l c r -> ((if i > 0 then l * amidasWithLine width i else 0)
                   + c * amidasWithoutLine width (i+1)
                   + (if i < width - 1
                     then r * amidasWithLine width (i+1) else 0))
                   `mod` modulus)
      lvec vec rvec
  where
    lvec = V.cons 0 $ V.init vec
    rvec = V.tail vec `V.snoc` 0

query :: Int -> Int -> Int -> Int 
query height width at = loop height $ V.iterateN width (const 0) 1
  where
    loop 0 vec = vec V.! (at - 1)
    loop h !vec = loop (h-1) $ update width vec

main :: IO ()
main = do
  [h,w,a] <- map read . words <$> getLine
  print $ query h w a
