#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int,int> pii;
#define pii pair<int,int>
#define pll pair<long long,long long>
 
#define fi first
#define se second
 
#define pb push_back
#define sz(x) ((int) (x).size())
#define rep(i,n) for (int i=1;i <=int(n);i++)
#define rrep(i,n) for (int i=int(n);i >= 1 ;i--)
#define ffor(i,n) for (int i=0;i <int(n);i++)
#define rfor(i,n) for (int i=int(n-1);i >= 0;i--)
#define all(x) x.begin(),x.end()
#define make_unique(x) sort(all((x))); (x).resize(unique(all((x))) - (x).begin())
 
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//use rng() for random
ll fac[4000002];
const ll MOD = 1e9 + 7;
ll power(ll  x,ll y )
{
    ll res = 1;     // Initialize result
 
    x = x % MOD; // Update x if it is more than or
                // equal to p
  
    if (x == 0) return 0; // In case x is divisible by p;
 
    while (y > 0)
    {
        // If y is odd, multiply x with result
        if (y & 1)
            res = (res*x) % MOD;
 
        // y must be even now
        y = y>>1; // y = y/2
        x = (x*x) % MOD;
    }
    return res;
}
ll invmul(ll a, ll b){
     return a*power(b,MOD-2) % MOD;
};

ll nck ( ll n , ll k ){
    // cout <<(invmul(fac[n],fac[k])%MOD+MOD)%MOD  <<' ' <<  fac[n-k] << '\n';
     if (k < 0 || n - k  < 0) return 0;
     ll res =fac[n];
     res = invmul(res,fac[k]) % MOD;
     res = invmul(res,fac[n-k]) % MOD;
     return res;
}
int main()
{
     ios_base::sync_with_stdio(false);
     cin.tie(NULL);
     fac[0] = 1;
     rep(i,4000000) fac[i] = (fac[i-1] * i ) % MOD;
     ll n,m,k ; cin >> n >> m >> k ;
    if ( n > m + k) {
         cout << 0 << '\n'; return 0;
       }
    ll res = nck(n+m,n);
     if ( n <  k + 1 ){
          cout << res  << '\n'; return 0;
     }
   
  //  cout << res << '\n';
     ll bold = nck(n+m,n-k-1);
 //   cout << n+m  << ' ' << n - k << '\n';
   
    cout << ((res - bold)%MOD + MOD)%MOD << '\n';
     
   
     return 0;
}
     
/*
5 7
3 4 6 8 11
1 2 3 4 5 6 7
 */
 

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(ll i=0;i<ll(n);i++)
#define REP(i,k,n) for(ll i=k;i<ll(n);i++)
#define all(a) a.begin(),a.end()
#define eb emplace_back
#define lb(v,k) (lower_bound(all(v),k)-v.begin())
#define ub(v,k) (upper_bound(all(v),k)-v.begin())
#define fi first
#define se second
#define PQ(T) priority_queue<T>
#define SPQ(T) priority_queue<T,vector<T>,greater<T>>
#define UNIQUE(a) sort(all(a));a.erase(unique(all(a)),a.end())
#define decimal cout<<fixed<<setprecision(10)
#define summon_tourist cin.tie(0);ios::sync_with_stdio(false)
using ll=long long;
using P=pair<ll,ll>;
using vi=vector<ll>;
using vvi=vector<vi>;
using vvvi=vector<vvi>;
constexpr ll inf=1001001001001001;
constexpr int INF=1001001001;
constexpr int mod=998244353;
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<class T> bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<class T> bool isin(T x,T l,T r){return (l)<=(x)&&(x)<=(r);}
template<class T> void out(T a){cout<<a<<'\n';}
template<class T> void outp(T a){cout<<'('<<a.fi<<','<<a.se<<')'<<'\n';}
template<class T> void outvp(T v){rep(i,v.size())cout<<'('<<v[i].fi<<','<<v[i].se<<')';cout<<'\n';}
template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<'\n';}
template<class T> void outvv(T v){rep(i,v.size())outv(v[i]);}
void YesNo(bool b){if(b)out("Yes");else out("No");}
void yesno(bool b){if(b)out("yes");else out("no");}
void YESNO(bool b){if(b)out("YES");else out("NO");}
ll modpow(ll a,ll b){ll c=1;while(b>0){if(b&1){c=a*c%mod;}a=a*a%mod;b>>=1;}return c;}
vi calc(ll x){vi v;while(x>0){v.eb(x%10);x/=10;}reverse(all(v));return v;}

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

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

int main(){
    int a,b;
    cin>>h>>w>>a>>b;
    out(dfs(0,0,a,b));
}