/*** author: yuji9511 ***/
#include <bits/stdc++.h>
// #include <atcoder/all>
// using namespace atcoder;
using namespace std;
using ll = long long;
using lpair = pair<ll, ll>;
using vll = vector<ll>;
const ll MOD = 1e9+7;
const ll INF = 1e18;
#define rep(i,m,n) for(ll i=(m);i<(n);i++)
#define rrep(i,m,n) for(ll i=(m);i>=(n);i--)
ostream& operator<<(ostream& os, lpair& h){ os << "(" << h.first << ", " << h.second << ")"; return os;}
#define printa(x,n) for(ll i=0;i<n;i++){cout<<(x[i])<<" \n"[i==n-1];};
void print() {}
template <class H,class... T>
void print(H&& h, T&&... t){cout<<h<<" \n"[sizeof...(t)==0];print(forward<T>(t)...);}
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
void vis_2d(vector< vector<ll> > v, ll h, ll w, ll pad=4){
    cout <<  "ij "; rep(i,0,w) cout << left << setw(pad) << i; cout << endl;
    rep(i,0,h){
        cout << i << ": ";
        rep(j,0,w){ if(v[i][j] == INF) cout << "x" << string(pad-1, ' '); else cout << left << setw(pad) << v[i][j]; }
        cout << endl;
    }
}

struct Combination{
private:
    ll N;
public:
    vll fac, facinv, inv;

    Combination(ll n){
        N = n;
        fac.resize(N+1); facinv.resize(N+1); inv.resize(N+1);
        fac[0] = fac[1] = 1;
        facinv[0] = facinv[1] = 1;
        inv[1] = 1;
        rep(i,2,N+1){
            fac[i] = fac[i-1] * i % MOD;
            inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
            facinv[i] = facinv[i-1] * inv[i] % MOD;
        }
    }

    ll power(ll x, ll n, ll m = MOD){
        if(n == 0) return 1LL;
        ll res = power(x * x % m, n/2, m);
        if(n % 2 == 1) (res *= x) %= m;
        return res;
    }

    ll nck(ll n, ll k){
        if(k == 0 || n == k) return 1LL;
        if(n < k) return 0LL;
        return fac[n] * facinv[k] % MOD * facinv[n-k] % MOD;
    }
    
    ll npk(ll n, ll k){
        if(k == 0) return 1LL;
        if(n < k) return 0LL;
        return fac[n] * facinv[n-k] % MOD;
    }
};

void solve(){
    ll N,M,K;
    cin >> N >> M >> K;
    Combination cb(2000010);
    ll ans = cb.nck(N+M, N);
    ll diff = 0;
    if(K >= N){
        diff = 0;
    }else if(K < N-M){
        print(0);
        return;
    }else{
        diff = N-K;
    }
    rep(i,0,diff){
        ll val = cb.nck(N+M, i);
        if(i > 0) val -= cb.nck(N+M, i-1);
        // print(val);
        ans -= val;
        ans = (ans + 2*MOD) % MOD;
    }
    print(ans);

}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    solve();
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MOD = 1000000007;

// 拡張ユークリッド互除法
ll extGCD(ll a, ll b, ll &x, ll &y) {
  if(b==0) {
    x=1; y=0; return a;
  } else {
    ll d = extGCD(b, a%b, y, x);
    y-=(a/b)*x;
    return d;
  }
}

// 階乗のmodにおける逆元を求める
ll calcInv(ll a, ll P) {
  ll x,y;
  extGCD(a, P, x, y);
  return (x+P)%P;
}

int main() {
  ll N,M,K; cin>>N>>M>>K;
  ll ans=0;
  if(N-M<=K && (N>=0 || M>=0)) {
    vector<ll> fac(N+M+2,1);
    for(ll i=1; i<=N+M+1; ++i) fac[i]=(fac[i-1]*i)%MOD;
    ans=fac[N+M];
    ans=(ans*calcInv(fac[N],MOD))%MOD;
    ans=(ans*calcInv(fac[M],MOD))%MOD;

    /*
    ll ng_height=N+M-(K+1);
    if(ng_height>=0 && M<=ng_height) {
    ll val=fac[ng_height];
    val=(val*calcInv(fac[ng_height-M],MOD))%MOD;
    val=(val*calcInv(fac[M],MOD))%MOD;
    ans=(ans-val+MOD)%MOD;
    }
    */
    if(N-(K+1)>=0) {
      ll val=fac[N+M];
      val=(val*calcInv(fac[N-(K+1)],MOD))%MOD;
      val=(val*calcInv(fac[M+K+1],MOD))%MOD;
      ans=(ans-val+MOD)%MOD;
    }
  }
  cout<<ans<<endl;
}
