#include <bits/stdc++.h>
using namespace std;
typedef long long lint;
#define rep(i,n) for(lint (i)=0;(i)<(n);(i)++)
#define repp(i,m,n) for(lint (i)=(m);(i)<(n);(i)++)
#define repm(i,n) for(lint (i)=(n-1);(i)>=0;(i)--)
#define INF (1ll<<60)
#define all(x) (x).begin(),(x).end()
const lint MOD =1000000007;
//const lint MOD=998244353;
const lint MAX = 4000000;
using Graph =vector<vector<lint>>;
typedef pair<lint,lint> P;
typedef map<lint,lint> M;
#pragma GCC optimize("Ofast")
#define chmax(x,y) x=max(x,y)
#define chmin(x,y) x=min(x,y)
 
 
lint fac[MAX], finv[MAX], inv[MAX];
 
void COMinit() 
{
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (lint i = 2; i < MAX; i++)
    {
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}
 
long long COM(lint n, lint k)
{
    if (n < k)
        return 0;
    if (n < 0 || k < 0)
        return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
 
lint primary(lint num)
{
    if (num < 2) return 0;
    else if (num == 2) return 1;
    else if (num % 2 == 0) return 0;
 
    double sqrtNum = sqrt(num);
    for (int i = 3; i <= sqrtNum; i += 2)
    {
        if (num % i == 0)
        {
            return 0;
        }
    }
 
    return 1;
}
   long long modpow(long long a, long long n, long long mod) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}
    lint lcm(lint a,lint b){
        return a/__gcd(a,b)*b;
    }
     lint gcd(lint a,lint b){
        return __gcd(a,b);
    }

    int main(){
       lint h,w,a,b;
       cin>>h>>w>>a>>b;
       lint t[h][w];
       vector<pair<P,P>> cd;
       rep(i,h){
           rep(j,w-1){
               cd.push_back({{i,j},{i,j+1}});
           }
       }
       rep(i,h-1){
           rep(j,w){
               cd.push_back({{i,j},{i+1,j}});
           }
       }
       lint aa=cd.size();
       lint g=1<<aa;
       lint ans=0;
       rep(bit,g){
           bool d[aa];
           fill(d,d+aa,false);
           lint count=0;
           rep(i,aa){
               if((1<<i)&bit){
                   d[i]=true;
                   count++;
               }
           }
           if(count!=a)continue;
           rep(i,h)rep(j,w)t[i][j]=0;
           rep(i,aa){
               if(d[i]){
                   t[cd[i].first.first][cd[i].first.second]++;
                   t[cd[i].second.first][cd[i].second.second]++;
               }
           }
           bool isp=true;
           rep(i,h)rep(j,w)if(t[i][j]>1)isp=false;
           if(isp)ans++;

       }
       cout<<ans<<endl;
      }
#include <bits/stdc++.h>
using namespace std;
#define PB push_back
#define MP make_pair
#define YES cout << "YES" << endl
#define Yes cout << "Yes" << endl
#define NO cout << "NO" << endl
#define No cout << "No" << endl
#define INF (1 << 30)
#define LLINF (1LL << 60)
#define MOD 998244353
//#define MOD 1000000007
#define rep(i, n) for (int i = 0; i < n; i++)
#define rrep(i, j, n) for (int i = j; i < n; i++)
#define llrep(i, n) for (ll i = 0; i < n; i++)
using ll = long long;
typedef pair<ll, ll> P;

int h, w;
bool used[16][16];

ll dfs(int i, int j, int a, int b)
{
    if(a<0||b<0){
        return 0;
    }
    if (j == w) {
        j = 0;
        i++;
    }
    if(i==h){
        return 1;
    }
    if (used[i][j]) {
        return dfs(i, j + 1, a, b);
    }
    ll res = 0;
    used[i][j] = true;
    res += dfs(i, j + 1, a, b - 1);
    if (j + 1 < w && !used[i][j + 1]) {
        used[i][j + 1] = true;
        res += dfs(i, j + 1, a - 1, b);
        used[i][j + 1] = false;
    }
    if (i + 1 < h && !used[i + 1][j]) {
        used[i + 1][j] = true;
        res += dfs(i, j + 1, a - 1, b);
        used[i + 1][j] = false;
    }
    used[i][j] = false;
    return res;
}

int main()
{
    cin >> h >> w;
    int a, b;
    cin >> a >> b;

    cout<<dfs(0, 0, a, b)<<endl;

    return 0;
}