#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
#include <chrono>
#include <typeinfo>
using namespace std;
using namespace std::chrono;
using namespace __gnu_pbds; 
#define lli long long int
#define fr(i,a,b) for(lli i=a;i<b;i++)
#define bfr(i,a,b) for(lli i=a;i>=b;i--)
#define fio ios_base::sync_with_stdio(false); cin.tie(NULL),cout.tie(NULL);
#define tc int t;cin>>t;while(t--)
//#define mod 1000000007LL
#define mod2 998244353LL
#define PI  3.14159265359
#define all(vec) vec.begin(),vec.end()  
#define ld long double
#define pb push_back
#define ordered_set tree<lli, null_type,less<lli>, rb_tree_tag,tree_order_statistics_node_update> 
lli pmod(lli x,lli y,lli mod){lli res=1;while(y>0){if(y&1)res = ((res%mod)*(x%mod))%mod;y>>=1;x= ((x%mod)*(x%mod))%mod;}return res;} 
lli power(lli x,lli y){lli res=1;while(y>0){if(y&1)res=res*x;y>>=1;x=x*x;}return res;}

lli gcd(lli a , lli b)
{
   if(b==0) return a;
   a%=b;
   return gcd(b,a);
}
lli cnt=0;


void solve(vector<vector<lli>> mat,lli a,lli b,lli row,lli col)
{
	
	lli x=-1,y=-1;
	fr(i,0,row)
	{fr(j,0,col)
	
		if(mat[i][j]==0)
			{x=i,y=j;break;}
		if(x!=-1)break;
	}
	if(x==-1){cnt++;

		
		return;}

	mat[x][y]=1;
	if(b>0)solve(mat,a,b-1,row,col);
	mat[x][y]=0;
	if(a>0 && x+1<row && mat[x+1][y]==0){
		mat[x][y]=2;
		mat[x+1][y]=2;solve(mat,a-1,b,row,col);
		mat[x+1][y]=0;
		mat[x][y]=0;
	}
	if(a>0 && y+1<col && mat[x][y+1]==0){
		mat[x][y]=3;
		mat[x][y+1]=3;
		solve(mat,a-1,b,row,col);
		mat[x][y]=0;
		mat[x][y+1]=0;

	}
	return;

}



int main()
{
    
         

    fio

    lli row,col,a,b;
    cin>>row>>col>>a>>b;
    vector<vector<lli>> mat(row,vector<lli>(col,0));
    solve(mat,a,b,row,col);
    cout<<cnt;

    
    



    




    





    
    

    
            

    
    
    

    

    
    



    





    

    




    return 0;}        

#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#include<cstring>
using namespace std;

int n, m;
bool visited[20][20];

int recur(int x, int y, int a, int b)
{
	int ret = 0;

	if (y == m)
	{
		x++;
		y = 0;
	}
	if (x == n)
	{
		return 1;
	}

	if (visited[x][y]) ret += recur(x, y + 1, a, b);
	else
	{
		if (a && y < m - 1 && !visited[x][y + 1])
		{
			visited[x][y] = true;
			visited[x][y + 1] = true;
			ret += recur(x, y + 1, a - 1, b);
			visited[x][y] = false;
			visited[x][y + 1] = false;
		}
		if (a && x < n - 1 && !visited[x + 1][y])
		{
			visited[x][y] = true;
			visited[x + 1][y] = true;
			ret += recur(x, y + 1, a - 1, b);
			visited[x][y] = false;
			visited[x + 1][y] = false;
		}
		if (b)
		{
			visited[x][y] = true;
			ret += recur(x, y + 1, a, b - 1);
			visited[x][y] = false;
		}
	}

	return ret;
}

int main()
{
	int a, b;

	cin >> n >> m >> a >> b;

	cout << recur(0, 0, a, b);
}