#include<bits/stdc++.h>
using namespace std;
#define ALL(x) begin(x),end(x)
#define rep(i,n) for(int i=0;i<(n);i++)
#define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl;
#define mod 1000000007
using ll=long long;
const int INF=1000000000;
const ll LINF=1001002003004005006ll;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}

struct IOSetup{
    IOSetup(){
        cin.tie(0);
        ios::sync_with_stdio(0);
        cout<<fixed<<setprecision(12);
    }
} iosetup;
 
template<typename T>
ostream &operator<<(ostream &os,const vector<T>&v){
    for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" ");
    return os;
}
template<typename T>
istream &operator>>(istream &is,vector<T>&v){
    for(T &x:v)is>>x;
    return is;
}

signed main(){
    int H,W,A,B;
    cin>>H>>W>>A>>B;

    int D=H*(W-1)+(H-1)*W;

    vector<vector<int>> v(H,vector<int>(W,0));
    int res=0;
    for(int bit=0;bit<(1<<D);bit++){
        if(__builtin_popcount(bit)!=A) continue;
        rep(i,H)rep(j,W) v[i][j]=0;
        
        rep(j,W-1)rep(i,H){
            int idx=(W-1)*i+j;
            if((bit>>idx)&1){
                v[i][j]++;
                v[i][j+1]++;
            }
        }

        rep(i,H-1)rep(j,W){
            int idx=H*(W-1)+W*i+j;
            if((bit>>idx)&1){
                v[i][j]++;
                v[i+1][j]++;
            }
        }

        bool f=true;
        rep(i,H)rep(j,W)if(v[i][j]>1) f=false;
        res+=f;
    }
    cout<<res<<endl;
    return 0;
}

#include <bits/stdc++.h>
#define rep(i,n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;

// vector<vector<bool>> used;
int h, w, a, b;
vector<vector<bool>> used;


int rec(int i, int j, vector<vector<bool>> &used, int a, int b) {
  if (j == w) return rec(i+1, 0, used, a, b);
  if (i == h) return 1;
  if (used[i][j]) return rec(i, j+1, used, a, b);

  int res = 0;
  used[i][j] = true;

  if (j+1 < w && !used[i][j+1] && a!=0) {
    used[i][j+1] = true;
    res += rec(i, j+1, used, a-1, b);
    used[i][j+1] = false;
  }

  if (i+1 < h && !used[i+1][j] && a!=0) {
    used[i+1][j] = true;
    res += rec(i, j+1, used, a-1, b);
    used[i+1][j] = false;
  }

  if (b!=0) {
    res += rec(i, j+1, used, a, b-1);
  }

  used[i][j] = false;
  return  res;
}

int main() {
  cin >> h >> w >> a >> b;
  used.assign(h,vector<bool>(w));
  int ans = rec(0, 0, used, a, b);
  cout << ans << endl;
  return 0;
}