//状态压缩,dp[i][j][x]表示第i行为止放了j个棋子,状态为x的方法数
//因为n*m<=80,所以较小的那个最多为9,以较小的那个做列,每行有1<<9个状态
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL long long
LL n,m,k,dp[81][21][1<<9];
LL mark[1<<9],len,ans;
//因为n*m<=80,所以较小的那个最多为9,以较小的那个做列,每行有1<<9个状态
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL long long
LL n,m,k,dp[81][21][1<<9];
LL mark[1<<9],len,ans;
//记录x状态下1的数目
LL num(LL x)
{
LL sum=0;
while(x)
{
if(x&1)
sum++;
x=x>>1;
}
return 0;
}
//判断x状态有没有相邻的1
bool judge(LL x)
{
if(x&(x<<1)) return false;
return true;
}
int main()
{
while(scanf("%I64d %I64d %I64d",&n,&m,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(mark,0,sizeof(mark));
len=0;
LL temp=max(n,m);
m=min(n,m);//m是较小的那个
n=temp;
//枚举合法的第一行状态
for(LL i=0;i<(1<<m);i++)
if(judge(i))
{
dp[1][num(i)][len]=1;
mark[len++]=i;//保存状态
}
//从第二行开始到第n行
for(LL i=2;i<=n;i++)
{
//放j个棋子
for(LL j=0;j<=k;j++)
{
//第i行的状态
for(LL x=0;x<len;x++)
{
//第i-1行状态
for(LL y=0;y<len;y++)
{
//第i行中1的个数
LL tmp=num(mark[x]);
//如果第i行和第i-1行不冲突,且第i-1行往上还能放棋子
if((mark[x]&mark[y]==0)&&j>tmp)
dp[i][j][x]+=dp[i-1][j-tmp][y];
}
}
}
LL num(LL x)
{
LL sum=0;
while(x)
{
if(x&1)
sum++;
x=x>>1;
}
return 0;
}
//判断x状态有没有相邻的1
bool judge(LL x)
{
if(x&(x<<1)) return false;
return true;
}
int main()
{
while(scanf("%I64d %I64d %I64d",&n,&m,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(mark,0,sizeof(mark));
len=0;
LL temp=max(n,m);
m=min(n,m);//m是较小的那个
n=temp;
//枚举合法的第一行状态
for(LL i=0;i<(1<<m);i++)
if(judge(i))
{
dp[1][num(i)][len]=1;
mark[len++]=i;//保存状态
}
//从第二行开始到第n行
for(LL i=2;i<=n;i++)
{
//放j个棋子
for(LL j=0;j<=k;j++)
{
//第i行的状态
for(LL x=0;x<len;x++)
{
//第i-1行状态
for(LL y=0;y<len;y++)
{
//第i行中1的个数
LL tmp=num(mark[x]);
//如果第i行和第i-1行不冲突,且第i-1行往上还能放棋子
if((mark[x]&mark[y]==0)&&j>tmp)
dp[i][j][x]+=dp[i-1][j-tmp][y];
}
}
}
}
ans=0;
for(LL i=0;i<len;i++)
ans+=dp[n][k][len];
printf("%I64d\n",ans);
}
}
ans=0;
for(LL i=0;i<len;i++)
ans+=dp[n][k][len];
printf("%I64d\n",ans);
}
}