#include<bits/stdc++.h>
using namespace std;
bool vis[17][17];
int h,w,a,b;
int ans;
void dfs(int x,int y,int a,int b)
{
	if(x==h&&y==w+1)
	{
		ans++;
		return ;
	}
	if(y==w+1)
	{
		dfs(x+1,1,a,b);
		return ;
	}
	if(vis[x][y])
	{
		dfs(x,y+1,a,b);
		return ;
	}
	if(a)
	{
		if(y!=w&&vis[x][y+1]==0)
		{
			vis[x][y]=1;
			vis[x][y+1]=1;
			dfs(x,y+2,a-1,b);
			vis[x][y+1]=0;
			vis[x][y]=0;
		}
		if(x!=h&&vis[x+1][y]==0)
		{
			vis[x][y]=1;
			vis[x+1][y]=1;
			dfs(x,y+1,a-1,b);
			vis[x+1][y]=0;
			vis[x][y]=0;
		}
	}
	if(b)
	{
		vis[x][y]=1;
		dfs(x,y+1,a,b-1);
		vis[x][y]=0;
	}
}
int main()
{
	scanf("%d%d%d%d",&h,&w,&a,&b);
	dfs(1,1,a,b);
	printf("%d",ans);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define repd(i,a,b) for (int i=(a);i<(b);i++)
#define rep(i,n) repd(i,0,n)
#define all(x) (x).begin(),(x).end()
#define SIZE(x) ll(x.size())
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
typedef long long ll;
const long long INF = 1LL << 60;
const long long MOD = 1000000007;
typedef pair<int, int> P;
int main()
{
    int H, W, A, B;
    cin >> H >> W >> A >> B;

    vector<vector<int>> Y, T;
    rep(bit, 1 << (H * W)) {
        vector<int> t;
        rep(i, H * W) {
            if ((1 << i) & bit) {
                t.push_back(i);
            }
        }

        vector<vector<int>> check(H, vector<int>(W + 1)), check2(H + 1, vector<int>(W));
        bool yb = true, tb = true;

        rep(i, t.size()) {
            int h = t[i] / W;
            int w = t[i] - (h * W);
            if ((W - 1) == w) yb = false;
            if ((H - 1) == h) tb = false;
            check[h][w] += 1; check[h][w + 1] += 1;
            check2[h][w] += 1; check2[h + 1][w] += 1;
        }

        rep(i, H) {
            rep(j, W) {
                if (check[i][j] >= 2) yb = false;
                if (check2[i][j] >= 2) tb = false;
            }
        }

        if (tb) {
            T.push_back(t);
        }
        if (yb) {
            Y.push_back(t);
        }
    }

    ll ans = 0;

    rep(i, Y.size()) {
        int cy = (int)Y[i].size();
        rep(j, T.size()) {
            int ct = (int)T[j].size();
            if ((cy + ct) != A) continue;
            vector<vector<int>> check(H, vector<int>(W));
            bool flag = true;
            rep(k, Y[i].size()) {
                int h = Y[i][k] / W;
                int w = Y[i][k] - (h * W);
                check[h][w]++; check[h][w + 1]++;
            }
            rep(k, T[j].size()) {
                int h = T[j][k] / W;
                int w = T[j][k] - (h * W);
                if (check[h][w] >= 1 || check[h + 1][w] >= 1) {
                    flag = false;
                    break;
                }
            }
            if (flag) ans++;/*
            if (flag) {
                cout << "Y: ";
                rep(k, Y[i].size()) {
                    cout << Y[i][k] << " ";
                }cout << endl;
                cout << "T: ";
                rep(k, T[j].size()) {
                    cout << T[j][k] << " ";
                }cout << endl;
            }*/
        }
    }

    cout << ans << endl;
    return 0;
}