#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 55;
const int MOD = 1000000007;
const int inf = 0x3f3f3f3f;
int map[N][N];
int dp[N][N][13][13];//存储此情况下继续往下或往右走的所有可能情况(初始位置的可能性更多,越往后走值越小)
int tmp = 0;
int n, m, t;
/*
void dfs(int x, int y, int k, int Max)//在条件判定时存在问题,即dp所存储的值和自己所想本身不相符,存储了(忽然觉得挺对的....(发现问题了,一个函数里有好几个dfs,第一个dfs导致后面dfs的tmp出现问题....))待解决
{
if(dp[x][y][k][Max] != -1){//已搜索过
return;
}
//已到达出口
if(x == n && y == m-1 || y == m && x == n-1){
if(k == t){
tmp = (tmp+1)%MOD;
}
}
if(x < n){
if(Max < map[x][y]){
dfs(x+1, y, k+1, map[x][y]);//拿
}
dfs(x+1, y, k, Max);//不拿
}
if(y < m){
if(Max < map[x][y]){
dfs(x, y+1, k+1, map[x][y]);//拿
}
dfs(x, y+1, k, Max);//不拿
}
dp[x][y][k][Max] = tmp;
}
*/
int dfs(int x, int y, int k, int Max) //表示从当前位置,当前现状往后搜索所得结果
{
if(dp[x][y][k][Max+1] != -1)
return dp[x][y][k][Max+1];
ll res = 0;
if(x == n-1 && y == m-1)
{
if(k == t || Max < map[x][y] && k == t-1) res++;
return res;
}
if(x < n-1)//向下搜索
{
if(Max < map[x][y])
res += dfs(x+1, y, k+1, map[x][y]) % MOD;//拿
res += dfs(x+1, y, k, Max) % MOD; //不拿
res %= MOD;
}
if(y < m-1)//右
{
if(Max < map[x][y])
res += dfs(x, y+1, k+1, map[x][y]) % MOD;//拿
res += dfs(x, y+1, k, Max) % MOD;//不拿
res %= MOD;
}
dp[x][y][k][Max+1] = res;
return res;
}
int main()
{
cin >> n >> m >> t;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> map[i][j];
}
}
memset(dp, -1, sizeof(dp));
/*
dfs(0, 0, 0, 0);
cout << tmp << endl;
*/
cout << dfs(0, 0, 0, -1) << endl; //最后一个代0,可能会与map数组的value冲突,故-1
return 0;
}