#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cstdlib>
#include<queue>
#include<set>
#include<cstdio>
#include<map>
#include<cassert>

using namespace std;

#define ll long long
#define reps(i, a, b) for(int i = a; i < b; i++)
#define rreps(i, a, b) for(int i = a-1; i >= b; i--)
#define rep(i, n) reps(i, 0, n)
#define rrep(i, n) rreps(i, n, 0)
#define P pair<int, int>
#define vec vector<int>
#define mat vector<vec>

const ll mod = 1000000007;
const int INF = 1001001001;

vec determined;
int h, w;
int a, b;
int ans = 0;

int f(int x, int y) {return x * w + y;}
P f_i(int pos) {return P(pos/w, pos%w);}

void dfs(int pos){
    if(pos == h*w){
        // cout << a << " " << b << endl;
        // rep(i, h){
        //     rep(j, w){
        //         cout << determined[f(i, j)];
        //     }cout << endl;
        // }cout << endl;
        if(a == 0 && b == 0) ans++;
        return;
    }
    P p = f_i(pos);
    if(determined[pos] != 0){
        dfs(pos+1);
    }else{
        // bを置く
        if(b > 0){
            b--;
            determined[pos] = 1;
            dfs(pos+1);
            determined[pos] = 0;
            b++;
        }

        // aを横に置く
        if(a > 0 && pos%w < w-1 && determined[pos+1] == 0){
            a--;
            determined[pos] = 2;
            determined[f(p.first, p.second+1)] = 2;
            dfs(pos+1);
            determined[pos] = 0;
            determined[f(p.first, p.second+1)] = 0;
            a++;
        }

        // if(pos==2){
        //     cout << a << endl;
        //     cout << b << endl;
        //     cout << pos << endl;
        //     cout << p.first+1 << " " << p.second << endl;
        //     cout << f(p.first+1, p.second) << endl;
        //     // cout << pos/w << endl;
        //     // cout << h-1 << endl;
            
        // }
        // aを縦に置く
        if(a > 0 && pos/w < h-1){
            
            a--;
            determined[pos] = 3;
            determined[f(p.first+1, p.second)] = 3;
            dfs(pos+1);
            determined[pos] = 0;
            determined[f(p.first+1, p.second)] = 0;
            a++;
        }
    }

}

int main(){
    cin >> h >> w;
    cin >> a >> b;
    determined = vec(h*w);
    // determined[f(0,0)] = 2;
    // determined[f(0,1)] = 2;
    // a--;
    dfs(0);
    cout << ans << endl;
}
#include <bits/stdc++.h>
#define maxn 100086

using namespace std;

typedef long long ll;

int n, m, a, b;
ll f[1 << 4][6][10];

int main(){
	scanf("%d%d%d%d", &n, &m, &a, &b);
	if(n < m) swap(n, m);
	f[0][1][0] = 1;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= m;j++){
			for(int k = 0;k < (1 << m);k++){
				for(int l = 0;l <= a;l++){
					if(!(k & (1 << (j - 1))) && i < n) f[k | (1 << (j - 1))][j + 1][l + 1] += f[k][j][l];
					f[(k | (1 << (j - 1))) ^ (1 << (j - 1))][j + 1][l] += f[k][j][l];
					if(j + 1 <= m && !(k & (1 << (j - 1))) && !(k & (1 << j))) f[k][j + 2][l + 1] += f[k][j][l];
				}
			}
		}
		for(int k = 0;k < (1 << m);k++){
			for(int l = 0;l <= a;l++){
				f[k][1][l] = f[k][m + 1][l];
				for(int o = 2;o <= m + 1;o++) f[k][o][l] = 0;
			}
		}
	}
	printf("%lld", f[0][1][a]);
}