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

#define all(x) (x).begin(),(x).end()
#define print(x) cout << (x) << endl
typedef long long ll;
using P = pair<int,int>;
using Graph = vector<vector<int>>;
//const ll MOD = 1000000007;
const ll MOD = 998244353;

void solve() {
    int h, w, a, b; cin >> h >> w >> a >> b;
    Graph c(h * (w - 1) + (h - 1) * w, vector<int>(4));
    int ind = 0;
    for(int i=0; i<h; i++){
        for(int j=0; j<w-1; j++){
            c[ind][0] = i;
            c[ind][1] = j;
            c[ind][2] = i;
            c[ind][3] = j + 1;
            ind++;
        }
    }
    for(int i=0; i<h-1; i++){
        for(int j=0; j<w; j++){
            c[ind][0] = i;
            c[ind][1] = j;
            c[ind][2] = i + 1;
            c[ind][3] = j;
            ind++;
        }
    }
    int ans = 0;
    for(int i=0; i<pow(2, ind); i++){
        int tmp = i;
        int cnt = 0;
        for(int j=0; j<ind; j++) if(i & (1<<j)) cnt++;
        if(cnt == a){
            Graph g(h, vector<int>(w, 0));
            for(int j=0; j<ind; j++) if(i & (1<<j)){
                g[c[j][0]][c[j][1]]++;
                g[c[j][2]][c[j][3]]++;
            }
            bool p = true;
            for(int ii=0; ii<h; ii++) for(int jj=0; jj<w; jj++) if(g[ii][jj] > 1) p = false;
            if(p) ans++;
        }
    }
    print(ans);
    return;
}

int main() { 
    cin.tie(0); cout.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(18);

    int t;
    //cin >> t;
    t = 1;
    while(t--) solve();
    return 0;
}
#include<bits/stdc++.h>
#include<fstream>
 
using namespace std;

#pragma GCC optimize ("Ofast")

#define all(x) x.begin() , x.end()
#define mp make_pair
#define gcd __gcd
typedef long long int ll;
typedef pair<ll , ll> pll;
typedef pair<int , int> pii;
typedef long double db;
typedef pair<ll , pll> plll;
typedef pair<pii , int> piii;
typedef pair<pll , pll> pllll;

const ll MAXN = 32 , MASK = 1 << 16 , md = 1e9 + 7 , inf = 2e9;

ll tav(ll n , ll k){
	ll res = 1;
	while(k > 0){
		if(k & 1){
			res *= n; res %= md;
		}
		n *= n; n %= md;
		k >>= 1;
	}
	return res;
}

ll dp[MASK][MAXN] , t[MAXN];

int main(){ // check MAXN
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	t[0] = 1;
	for(ll i = 1 ; i < 20 ; i++){
		t[i] = t[i - 1] << 1;
	}
	memset(dp , 0 , sizeof(dp));
	ll h , w , a , b , q;
	cin>>h>>w>>a>>b; q = h * w;
	ll lm = 1 << (h * w);
	dp[0][0] = 1;
	for(ll mask = 1 ; mask < lm ; mask++){
		ll av;
		for(ll j = 0 ; j < q ; j++){
			if(mask & t[j]){
				av = j;
				break;
			}
		}
		ll h = mask - t[av];
		for(ll j = 1 ; j <= b ; j++){
			dp[mask][j] += dp[h][j - 1];
		}
		if(av % w != w - 1 && (mask & t[av + 1])){
			h -= t[av + 1];
			for(ll j = 0 ; j <= b ; j++){
				dp[mask][j] += dp[h][j];
			}
			h += t[av + 1];
		}
		if(av + w < q && (mask & t[av + w])){
			h -= t[av + w];
			for(ll j = 0 ; j <= b ; j++){
				dp[mask][j] += dp[h][j];
			}
			h += t[av + w];
		}
	}
	cout<<dp[lm - 1][b]<<'\n';
	return 0;
}

/*

*/