#include <bits/stdc++.h>
// clang-format off
using namespace std; using ll = long long; using ull = unsigned long long; using pll = pair<ll,ll>; const ll INF = 4e18;
void print0() {}
template<typename Head,typename... Tail> void print0(Head head,Tail... tail){cout<<fixed<<setprecision(15)<<head;print0(tail...);}
void print() { print0("\n"); }
template<typename Head,typename... Tail>void print(Head head,Tail... tail){print0(head);if(sizeof...(Tail)>0)print0(" ");print(tail...);}
// clang-format on

ll all;
ll memo[65537][9][17];
ll h, w, a, b;
ll bit(ll i, ll j) {
    return 1ULL << (i * w + j);
}
bool empty(ll stat, ll i, ll j){
    if (i >= h) return false;
    if (j >= w) return false;
    if(stat & bit(i,j)) return false;
    return true;
}
ll dfs(ll stat, ll full, ll half, ll bi, ll bj) {
    if (full < 0 || half < 0) return 0;
    if (stat + 1 == all) return 1;
    if (memo[stat][full][half] != -INF) return memo[stat][full][half];

    // 常に一番左上に置く
    ll ti = -1;
    ll tj = -1;
    for (ll j = bj; j < w; j++) {
        if(empty(stat,bi,j)){
          ti=bi;
          tj=j;
          break;
        }
    }
    for (ll i = bi+1; i < h; i++) {
        if (ti >= 0) break;
        for (ll j = 0; j < w; j++) {
            if (empty(stat,i,j)) {
                ti = i;
                tj = j;
                break;
            }
        }
    }
    return memo[stat][full][half] =
      dfs(stat | bit(ti,tj), full, half - 1, ti, tj) +
      (empty(stat,ti+1,tj) ? dfs(stat | bit(ti+1,tj) | bit(ti,tj), full - 1, half, ti, tj) : 0) +
      (empty(stat,ti,tj+1) ? dfs(stat | bit(ti,tj+1) | bit(ti,tj), full - 1, half, ti, tj) : 0);
}
int main() {
    cin >> h >> w >> a >> b;
    all = 1ll << (h * w);
    for(ll s=0; s<all; s++){
      for(ll i=0; i<=a; i++){
        for(ll j=0; j<=b; j++){
          memo[s][i][j] = -INF;
        }
      }
    }
    print(dfs(0, a, b, 0, 0));
}

#include "bits/stdc++.h"
#define int long long
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
const ll INF = (1LL << 61);
ll mod = 998244353;
int ans = 0;
int next_combination(int sub) {
	if (sub == 0)return 1001001001;
	int x = sub & -sub, y = sub + x;
	return (((sub & ~y) / x) >> 1) | y;
}
int H, W;
int A, B;
int tmp[17];
map<int, bool>mp;
int cnt2 = 0;
void dfs(int nowA, vector<vector<int>>&now) {
	cnt2++;
	int nowbit = 0;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			nowbit += tmp[i * W + j]*now[i][j];
		}
	}
	int cnt = 0;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			if (i + 1 < H && now[i][j] == 0 && now[i + 1][j] == 0)cnt++;
			if (j + 1 < W && now[i][j] == 0 && now[i][j + 1] == 0)cnt++;
		}
	}
	if (mp[nowbit] || cnt < nowA)return;
	mp[nowbit] = true;
	
	if (nowA <= 0) {
		ans++;
		return;
	}
	
	
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			if (i + 1 < H && now[i][j] == 0 && now[i + 1][j] == 0) {
				now[i][j] = 2; now[i + 1][j] = 2;
				nowA--;
				dfs(nowA, now);
				nowA++;
				now[i][j] = 0; now[i + 1][j] = 0;

			}
			if (j + 1 < W && now[i][j] == 0 && now[i][j + 1] == 0) {
				now[i][j] = 3; now[i][j + 1] = 3;
				nowA--;
				dfs(nowA, now);
				nowA++;
				now[i][j] = 0; now[i][j + 1] = 0;

			}
		}
	}
	return;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> H >> W;
	cin >> A >> B;
	
	int s = 1;
	for (int i = 0; i < 17; i++) {
		tmp[i] = s;
		s *= 4;
	}
	int bit = (1 << B) - 1;
	for (; bit < (1 << (H*W)); bit = next_combination(bit)) {
		mp.clear();
		vector<vector<int>>now(H, vector<int>(W, 0));
		for (int i = 0; i < H * W; i++) {
			if (bit & (1 << i)) {
				now[i / W][i % W] = 1;
			}
		}
		dfs(A, now);
		//cout << "NOW" << endl;
	}
	//cout << cnt2 << endl;
	cout << ans << endl;
	return 0;
}