# include<bits/stdc++.h>

using namespace std;
# define l long long 
# define db double 
# define rep(i,a,b) for(l i=a;i<b;i++)
# define vi vector<l>
# define vvi vector<vi>
# define vsi vector<set<l> >
# define pb push_back
# define mp make_pair
# define ss second
# define ff first
# define pii pair<l,l>
# define trvi(v,it) for(vi::iterator it=v.begin();it!=v.end();++it)
# define read(a) freopen(a,"r",stdin)
# define write(a) freopen(a,"w",stdout)
# define io ios::sync_with_stdio(false)

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ' ' << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; }
 

#ifdef KRISHNAN_DEBUG
void dbg_out() { cerr << endl; }
template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
#define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif

const bool MULTIPLE_TEST_CASES = false;

const l MOD=1e9+7;
const l N=1e5+5;
const l INF=1e12;

l H,W,A,B;

void cnt(vector<vector<bool> > &visited, l A_rem, l B_rem, l &ans) {
	if(A_rem<0 || B_rem<0) {
		return;
	}
	if(A_rem==0 && B_rem==0) {
		ans++;
		return;
	
	}
	bool found = false;
	l i=-1,j=-1;
	for(l x=0;x<H;x++) {
		
		for(l y=0;y<W;y++) {
			if(visited[x][y]==false) {
				i=x;
				j=y;
				found = true;
				break;
			}
		}
		if(found) {
			break;
		}
	}
	if(i==-1 || j==-1) {
		return;
	}
	dbg(i,j);
	visited[i][j]=true;
	cnt(visited, A_rem, B_rem-1,ans);

	if(i+1<H && visited[i+1][j]==false) {
		visited[i+1][j]=true;
		cnt(visited, A_rem-1, B_rem,ans);
		visited[i+1][j]=false;
	}

	if(j+1<W && visited[i][j+1]==false) {
		visited[i][j+1]=true;
		cnt(visited, A_rem-1, B_rem,ans);
		visited[i][j+1]=false;
	}
	visited[i][j] = false;
}

void solve() {
	
	cin>>H>>W>>A>>B;

	vector<vector<bool> > visited(H, vector<bool>(W, false));

	l ans = 0;
	cnt(visited, A, B, ans);
	cout<<ans<<"\n";

	return;
}


int main(){
	io;
	int t=1;
	if (MULTIPLE_TEST_CASES) cin>>t;
	rep(i,0,t) {
		solve();
	}

	return 0;
}

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

using VI = vector<int>;

int h, w;

int g(VI& a, int i, int d);

int f(VI& v) {
    int i = find(cbegin(v), cend(v), 0) - cbegin(v);
    return i < v.size() ? g(v, i, 0) + g(v, i, 1) : 1;
}


int g(VI& v, int i, int d) {
    int j = i + (d ? w : 1);
    if (!d && i % w == w - 1 || d && i / w == h - 1 || v[j]) {
        return 0;
    }
    v[i] = v[j] = 1;
    int r = f(v);
    v[i] = v[j] = 0;
    return r;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int a, b;
    cin >> h >> w >> a >> b;
    VI v(2 * a);
    v.insert(end(v), b, 1);
    int r = 0;

    do r += f(v);
    while (next_permutation(begin(v), end(v)));

    cout << r << '\n';
    return 0;
}
