unittest
{
	assert( [ "1 3 2" ].solve == 1 );
	assert( [ "1 3 1" ].solve == 2 );
	assert( [ "2 3 3" ].solve == 1 );
	assert( [ "2 3 1" ].solve == 5 );
	assert( [ "7 1 1" ].solve == 1 );
	assert( [ "15 8 5" ].solve == 437760187 );
}



import std.conv;
import std.format;
import std.range;
import std.stdio;

void main()
{
	stdin.byLineCopy.solve.writeln;
}

auto solve( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto h = 0L;
	auto w = 0L;
	auto k = 0L;
	input.front.formattedRead!"%s %s %s"( h, w, k );
	
	// dp[ y行目 ][ x列目 ] = x列目に到達できる横線の引き方のパターン数
	const M = 10L ^^ 9 + 7;
	auto dp = new ModWorld!M[][]( 1 + h, w );
	dp[ 0 ][ 0 ] = 1;
	foreach( y; 0L .. h )
	{
		// 行ごとに横線を引くパターンをbit全探索
		LOOP: foreach( b; 0L .. 1L << ( w - 1 ) )
		{
			// レギュレーション違反の引き方を除外
			foreach( x; 1L .. w - 1 )
			{
				auto bl = b & ( 1L << ( x - 1 ) );
				auto br = b & ( 1L << x );
				if( br && bl ) continue LOOP;
			}
			
			// 移動方法をシミュレート
			foreach( x; 0L .. w )
			{
				auto bl = b & ( 1L << ( x - 1 ) );
				auto br = b & ( 1L << x );
				if(          0 < x              && bl ) dp[ y + 1 ][ x - 1 ] += dp[ y ][ x ];
				else if( x + 1 < dp[ y ].length && br ) dp[ y + 1 ][ x + 1 ] += dp[ y ][ x ];
				else                                    dp[ y + 1 ][ x     ] += dp[ y ][ x ];
			}
		}
	}
	return dp[ $ - 1 ][ k - 1 ];
}

// モジュラ整数型（n mod M）
struct ModWorld( long M )
{
	long n;
	
	void opUnary( string OP )() if( OP == "++" ){ this.n = ( this.n + 1 ) % M; }
	void opUnary( string OP )() if( OP == "--" ){ this.n = ( this.n + M - 1 ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "+"  ){ this.n = ( this.n + r.n ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "-"  ){ this.n = ( this.n + M - r.n ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "*"  ){ this.n = ( this.n * r.n ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "/"  ){ this *= r ^^ ModWorld( M - 2 ); }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "^^" )
	{
		auto a = this.n;
		this.n = 1L;
		for( auto i = r.n; 0 < i; i >>= 1 )
		{
			if( i & 1 ) this.n = ( this.n * a ) % M;
			a = ( a * a ) % M;
		}
	}
	auto opBinary( string OP )( ModWorld r ){ auto l = this; l.opOpAssign!OP( r ); return l; }
	
	void opAssign( long r ){ this.n = r; }
	void opOpAssign( string OP )( long r ){ this.opOpAssign!OP( ModWorld( r ) ); }
	auto opBinary( string OP )( long r ){ return this.opBinary!OP( ModWorld( r ) ); }
	auto opBinaryRight( string OP )( long l ){ return ModWorld( l ).opBinary!OP( this ); }
	auto opEquals( long r ){ return this.n == r; }
	
	auto toString(){ return this.n.to!string; }
}
