#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const ll inf = 1000 * 1000 * 1000 + 7;
bool getBit(ll mask, ll index) {
return mask&(1ll << index);
}
long long dp[20][5007][307];
bool used[5007][5007];
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
memset(dp, 0, sizeof(dp));
vector<ll> Tried,Tried_king;
for (ll mask = 0; mask < 1 << n; ++mask) {
ll index = 0;
bool Cheak = true;
for (ll index = 1; 1 << index <= mask; ++index) {
if (getBit(mask, index - 1) == 1 && getBit(mask, index) == 1) {
Cheak = false; break;
}
}
if (Cheak == true)Tried.push_back(mask);
}
for (ll mask : Tried) {
ll King = 0;
for (ll index = 0; 1 << index <= mask; ++index) {
King += getBit(mask, index);
}
Tried_king.push_back(King);
}
vector<pair<ll, ll>> Cur;
Cur.resize(n + 1);
vector<pair<ll, pair<ll, ll>>> Combination;
for (ll mark = 0; mark < Tried.size(); ++mark) {
ll i = Tried[mark];
ll King = Tried_king[mark];
for (ll j : Tried) {
if (!used[i][j]) {
for (ll ii = 0; ii < n; ++ii)Cur[ii].first = Cur[ii].second = 0;
used[i][j] = true;
ll t1 = 0, t2 = 0;
ll index = 0;
while ((1ll<<index)<=i) {
Cur[t1++].first = getBit(i, index);
++index;
}
index = 0;
while ((1ll << index) <= j) {
Cur[t2++].second = getBit(j, index);
++index;
}
bool Cheak = true;
for (ll d = 0; d < n; ++d) {
ll p = 0;
p += Cur[d].second; p += Cur[d].first;
if (d != n - 1) {
p += Cur[d + 1].first;
p += Cur[d + 1].second;
}
if (d > 0) {
p += Cur[d - 1].first; p += Cur[d - 1].second;
}
if (Cur[d].first == 1 && p > 1) {
Cheak = false; break;
}
if (Cur[d].second == 1 && p > 1) {
Cheak = false; break;
}
}
if (Cheak == true) {
Combination.push_back(make_pair(King, make_pair(j, i)));
}
}
}
}
for (ll i = 0; i < Tried.size(); ++i) {
dp[0][Tried[i]][Tried_king[i]]++;
}
for (ll i = 1; i < m; ++i) {
for (ll King = 0; King <= k; ++King) {
for (pair<ll, pair<ll, ll>> cur:Combination) {
dp[i][cur.second.second][cur.first + King] += dp[i - 1][cur.second.first][King];
dp[i][cur.second.second][cur.first + King] %= inf;
}
}
}
ll ans = 0;
for (ll i = 0; i < Tried.size(); ++i) {
ans += dp[m - 1][Tried[i]][k];
ans %= inf;
}
cout << ans << endl;
return 0;
}