#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int h,w,a,ans=0;
bool f[16][16];
inline void dfs(int x,int y,int n) {
	if(y>w) {
		y=1,
		++x;
	}
	if(x==h&&y==w) {
		if(n==0) {
			++ans;
		}
		return;
	}
	dfs(x,y+1,n);
	if(n>0&&f[x][y]) {
		if(f[x+1][y]) {
			f[x+1][y]=f[x][y]=false;
			dfs(x,y+1,n-1);
			f[x+1][y]=f[x][y]=true;
		}
		if(f[x][y+1]) {
			f[x][y+1]=f[x][y]=false;
			dfs(x,y+1,n-1);
			f[x][y+1]=f[x][y]=true;
		}
	}
	return;
}
signed main() {
	memset(f,false,sizeof f);
	cin>>h>>w>>a;
	for(int i=1; i<=h; ++i) {
		for(int j=1; j<=w; ++j) {
			f[i][j]=true;
		}
	}
	dfs(1,1,a);
	cout<<ans;
	return 0;
}
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>

using namespace std;

int H, W, A, B, ans = 0;

void dfs(int i, long long bit, int a, int b) {
  if (i == H*W) {
    ans++;
    return;
  }

  if (bit & (1 << i)) {
    dfs(i + 1, bit, a, b);
    return;
  }

  bit |= (1 << i);

  if (a) {
    if ((i + 1) <= H*W && ((i + 1) % W) != 0 && (~bit & 1 << (i + 1))) {
      dfs(i + 1, bit | (1 << (i + 1)), a-1, b);
    }

    if ((i + W) <= (W*H)) {
      dfs(i + 1, bit | (1 << (i + W)), a-1, b);
    }
  }

  if (b) {
    dfs(i + 1, bit, a, b-1);
  }
}

int main()
{
  cin >> H >> W >> A >> B;
  dfs(0, 0, A, B);
  cout << ans << endl;
  return 0;
}
