#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
#define rep(i, n) for (ll i = 0; i < (ll)(n); ++i)
#define rep2(i, s, n) for (ll i = (s); i < (ll)(n); i++)
const ll MAX = 1001001;
const ll MOD = 1000000007;
const double pi = 2.0 * asin(1.0);
ll dx[4] = {1, 0, -1, 0};
ll dy[4] = {0, 1, 0, -1};
int main()
{
    ll h, w, a, b;
    cin >> h >> w >> a >> b;
    if (h < w)
    {
        swap(h, w);
    }
    ll ans = 0;
    for (int tmp = 0; tmp < (1 << (h * w)); tmp++)
    {
        bitset<16> s(tmp);
        ll co = 0;
        vector<vector<bool>> c(h, vector<bool>(w));
        rep(i, h * w)
        {
            if (s.test(i))
            {
                co++;
                c[i / w][i % w] = true;
            }
        }
        if (co != b)
        {
            continue;
        }
        vector<ll> crt((1 << w));
        vector<ll> next((1 << w));
        crt[0] = 1;
        for (ll i = h - 1; i >= 0; i--)
        {
            for (ll j = w - 1; j >= 0; j--)
            {
                rep(u, (1 << w))
                {
                    if ((u >> j & 1) || (c[i][j]))
                    {
                        next[u] = crt[u & ~(1 << j)];
                    }
                    else
                    {
                        ll res = 0;
                        if (j + 1 < w && !(u >> (j + 1) & 1) && !c[i][j + 1])
                        {
                            res += crt[u | 1 << (j + 1)];
                        }
                        if (i + 1 < h && !c[i + 1][j])
                        {
                            res += crt[u | 1 << j];
                        }
                        next[u] = res;
                    }
                }
                swap(crt, next);
            }
        }
        ans += crt[0];
    }
    cout << ans << endl;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(v) v.begin(), v.end()
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define repr(i, n) for (ll i = (n-1); i >= 0; i--)
#define Rep(n) for (ll _ = 0; _ < (ll)(n); _++)

template <class S>S sum(vector<S>& a) {return accumulate(all(a), S());}
template <class S>S max(vector<S>& a) {return *max_element(all(a));}
template <class S>S min(vector<S>& a) {return *min_element(all(a));}
ll max(int a, ll b) { return max((ll)a, b); } ll max(ll a, int b) { return max(a, (ll)b); }
ll min(int a, ll b) { return min((ll)a, b); } ll min(ll a, int b) { return min(a, (ll)b); }

#define VM 10
void eprint() { cerr << endl; }
template <class First, class... Rest>
void eprint(First f, Rest... r) {
  cerr << f << ' ';
  eprint(r...);
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  size_t output_num = v.size();
  bool is_omitted = false;
#ifdef VM
  if (VM < output_num) {
    output_num = VM;
    is_omitted = true;
  }
#endif
  os << "[";
  for (size_t i = 0; i < output_num - 1; i++) os << v[i] << ", ";
  os << v[output_num - 1];
  if (is_omitted) os << ", ...";
  return os << "]";
}
template <class S, class T>
ostream& operator<<(ostream& os, const map<S,T>& m) {
  os << "{\n";
  for(auto [k,v]: m){
    os << k << ": " << v << ",\n";
  }
  return os << '}';
}

void Main();
int main() {
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(20);
  Main();
  return 0;
}

using Heya = vector<vector<bool>>;

vector<pair<Heya,int>> patterns;
int h, w, a;

void dfs(Heya heya, int row, int used){
  if(used > a) return;
  if(row == h){
    patterns.push_back(make_pair(heya, used));
    return;
  }
  if(w == 2){
    auto h1 = heya;
    h1[row][0] = true;
    h1[row][1] = true;
    dfs(heya, row+1, used);
    dfs(h1, row+1, used+1);
  }else if(w == 3){
    auto h1 = heya;
    auto h2 = heya;
    h1[row][0] = true;
    h1[row][1] = true;
    h2[row][1] = true;
    h2[row][2] = true;
    dfs(heya, row+1, used);
    dfs(h1, row+1, used+1);
    dfs(h2, row+1, used+1);
  }else{
    auto h1 = heya;
    auto h2 = heya;
    auto h3 = heya;
    auto h4 = heya;
    dfs(heya, row+1, used);
    h1[row][0] = true;
    h1[row][1] = true;
    h1[row][2] = true;
    h1[row][3] = true;
    dfs(h1, row+1, used+2);
    h2[row][0] = true;
    h2[row][1] = true;
    dfs(h2, row+1, used+1);
    h3[row][1] = true;
    h3[row][2] = true;
    dfs(h3, row+1, used+1);
    h4[row][2] = true;
    h4[row][3] = true;
    dfs(h4, row+1, used+1);
  }
}
ll ans;

void dfs_col(Heya heya, int row, int col, int used){
  if(used > a) return;
  if(col == w){
    if(used == a){
      ans++;
    }
    return;
  }
  for(int i = row; i < h-1; i++){
    if(!heya[i][col] && !heya[i+1][col]){
      auto h1 = heya;
      h1[i][col] = true;
      h1[i+1][col] = true;
      dfs_col(h1, i+2, col, used+1);
    }
  }
    dfs_col(heya, 0, col+1, used);
}

void Main(){
  cin >> h >> w >> a;
  ans = 0;
  if(h < w) swap(h, w); // h > w
  if(w > 1){
    dfs(vector<vector<bool>>(h, vector<bool>(w, false)), 0,  0);
  }else{
    patterns.push_back(make_pair(vector<vector<bool>>(h, vector<bool>(w, false)), 0));
  }
  for(auto [p, u]: patterns){
    dfs_col(p, 0, 0, u);
  }
  cout << ans << endl;
}
