#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

using namespace std;
/*
int qsort_int_compare_ascend(const void *a, const void *b) {
	return *(int*)a - *(int*)b;
}
int qsort_int_compare_descend(const void *a, const void *b) {
	return *(int*)b - *(int*)a;
}
void ascendOrder(int size, int *array) {//sho-jun
	qsort(array, size, sizeof(int), qsort_int_compare_ascend);
}
void descendOrder(int size, int *array) {//ko-jun
	qsort(array, size, sizeof(int), qsort_int_compare_descend);
}

int main() {
	int N, M;
	cin >> N >> M;

	int *P = new int[M];
	int *Y = new int[M];
	int *num = new int[N]; for (int i = 0; i < N; i++) { num[i] = 0; }
	int **x = new int*[N];

	for (int i = 0; i < M; i++) {
		cin >> P[i] >> Y[i];
		num[P[i] - 1]++;
	}

	for (int i = 0; i < N; i++) {
		x[i] = new int[num[i]];
		for (int k = 0; k < num[i]; k++) {
			x[i][k] = 0;
		}
		num[i] = 0;
	}

	for (int i = 0; i < M; i++) {
		x[P[i] - 1][num[P[i] - 1]] = Y[i];
		num[P[i] - 1]++;
	}
	for (int i = 0; i < N; i++) {
		ascendOrder(num[i], x[i]);
	}
	char string[7] = {};
	for (int i = 0; i < M; i++) {
		int n = P[i] - 1;
		for (int k = 0; k < num[n]; k++) {
			if (x[n][k] == Y[i]) {
				int f = n+1;
				for (int d = 5; d >= 0; d--) {
					string[d] = '0'+(f % 10);
					f /= 10;
				}
				cout << string;

				f = k + 1;
				for (int d = 5; d >= 0; d--) {
					string[d] = '0' + (f % 10);
					f /= 10;
				}
				cout << string <<endl;
				break;
			}
		}
	}

	for (int i = 0; i < N; i++) {
		delete[] x[i];
	}
	delete[] x;
	delete[] num;
	delete[] P;
	delete[] Y;
	return 0;
}*/


/////////////         modの計算

static int mod = 1000000007;
int mod_add(int a, int b) {
	long long k = a%mod; k += b%mod; k %= mod;
	return k;
}
int mod_sub(int a, int b) {
	long long k = a%mod; k += (mod - (b%mod)) % mod; k %= mod;
	return k;
}
int mod_multi(int a, int b) {
	long long k = a%mod; k *= b%mod; k %= mod;
	return k;
}
int mod_div(int a, int b) {
	int X = mod, Y = b, X1 = 1, X2 = 0, Y1 = 0, Y2 = 1;
	while (1) {
		int q = X / Y;
		int r = X - Y*q;
		X1 = mod_sub(X1, mod_multi(q, Y1));
		X2 = mod_sub(X2, mod_multi(q, Y2));

		if (a%r == 0) {
			int k = a / r;
			return mod_multi(X2, k);
		}

		int z;
		z = X1; X1 = Y1; Y1 = z;
		z = X2; X2 = Y2; Y2 = z;
		X = Y; Y = r;
	}
}
int mod_combination(int n, int r) {
	int a = 1, b = 1;
	for (int i = 1; i <= r; i++) {
		a = mod_multi(a, n - i + 1);
		b = mod_multi(b, i);
	}
	return mod_div(a, b);
}

int __n[8] = { 0,0,2,3,5,8,13,21 };
int product(int a, int b, int W) {
	int A = __n[a];
	int B = __n[W - 1 - b];
	if (__n[a] == 0) {
		A=1;
	}
	if (__n[W - 1 - b] == 0) {
		B=1;
	}
	return A*B;
}
int main() {
	int W, H, K;
	cin >> H >> W >> K;

	int *n1 = new int[W];
	int *n2 = new int[W];
	for (int i = 0; i < W; i++) {
		n1[i] = 0;
	}
	n1[0] = 1;

	for (int i = 0; i < H; i++) {
		for (int x = 0; x < W; x++) {
			n2[x] = mod_multi(n1[x], product(x, x, W));

			if (x > 0) {
				n2[x] = mod_add(n2[x], mod_multi(n1[x - 1], product(x - 1, x, W)));
			}
			if (x < W - 1) {
				n2[x] = mod_add(n2[x], mod_multi(n1[x + 1], product(x, x + 1, W)));
			}
		}
		for (int x = 0; x < W; x++) {
			n1[x] = n2[x];
		}
	}

	cout << n1[K - 1];
	delete[] n1;
	delete[] n2;
	return 0;
}

Measured memory_bytes: 256