#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

int n, m, a, b, ans = 0;
int vis[21][21];

void dfs(int x,int y)
{
	if(x==n+1)
	{
		if(a==0 && b==0) ans++;
		return;
	}

	if(vis[x][y]==1)
	{
		if(y==m) dfs(x+1,1);
		else dfs(x,y+1);
		return;
	}

	if(b)
	{
		--b;
		vis[x][y]=1;
		if(y==m) dfs(x+1,1);
		else dfs(x,y+1);
		vis[x][y]=0;
		++b;
	}

	if(a)
	{
		--a;
		vis[x][y]=1;
		if(vis[x+1][y]==0)
		{
			vis[x+1][y]=1;
			if(y==m) dfs(x+1,1);
			else dfs(x,y+1);
			vis[x+1][y]=0;
		}

		if(vis[x][y+1]==0)
		{
			vis[x][y+1]=1;
			if(y==m) dfs(x+1,1);
			else dfs(x,y+1);
			vis[x][y+1]=0;
		}
		++a;
		vis[x][y]=0;
	}
}

int main()
{
	cin >> n >> m >> a >> b;
	dfs(1,1);
	cout << ans << endl;
	return 0;
}
/**
 *    author:  naniwazu   
**/
#include<bits/stdc++.h>
using namespace std;

//#define int long long
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
typedef long double ld;
const int inf=1e9+7;
const ll INF=1LL<<60 ;
const ll mod=1e9+7 ;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<int, int> P;
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;
#define fr first
#define sc second
#define all(c) c.begin(),c.end()
#define pb push_back
#define debug(x)  cerr << #x << " = " << (x) << endl;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template< typename T >
int64_t largest_rectangle(vector< T > height)
{
  stack< int > st;
  height.push_back(0);
  vector< int > left(height.size());
  int64_t ret = 0;
  for(int i = 0; i < height.size(); i++) {
    while(!st.empty() && height[st.top()] >= height[i]) {
      ret = max(ret, (int64_t) (i - left[st.top()] - 1) * height[st.top()]);
      st.pop();
    }
    left[i] = st.empty() ? -1 : st.top();
    st.emplace(i);
  }
  return (ret);
}
int popcount(int x)
{
    int cnt = 0;
    while(x) cnt+=x&1, x>>=1;
    return cnt;
}

void solve(){
  int H, W, A, B;
  cin >> H >> W >> A >> B;
  int ans = 0;
  rep(bit, 1 << (2*H*W-H-W)){
    bool flag = true;
    if(!(popcount(bit) == A)){
      continue;
    }
    vector<int> S(H*W,0);
  rep(i,H){
    rep(j,W-1){
      if (bit >> (i*(W-1)+j) & 1){
                if (S[i*W+j] or S[i*W+j+1]){
                    flag = false;
                }
                S[i*W+j] = 1;
                S[i*W+j+1] = 1;
      }
    }
  }
  rep(j,W){
    rep(i,H-1){
      if (bit >> (j*(H-1)+i+H*(W-1)) & 1){
                if (S[i*W+j] or S[i*W+j+W]){
                    flag = false;
                }
                S[i*W+j] = 1;
                S[i*W+j+W] = 1;
      }
    }
  }
  if (flag){
    ans++;
  }
  }
  cout << ans << "\n";
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	//cout << fixed << setprecision(10);
	//int t; cin >> t; rep(i, t)solve();
	solve();
	return 0;
}