#include <bits/stdc++.h> 
using namespace std;
std::chrono::high_resolution_clock::time_point start_time = std::chrono::high_resolution_clock::now();
// Defines
#define all(x) (x).begin(),(x).end()
#define sortall(x) sort(x.begin(),x.end())
#define maxin(x) *max_element(x.begin(),x.end())        
#define minin(x) *min_element(x.begin(),x.end())
#define lint long long int                              
#define nl '\n'
#define INF (lint)1e18
#define EPS (long double)1/(INF)
//#define MOD (lint)998244353
#define MOD (lint)(1e9+7)
//Debugs
#ifdef LOCAL  
    #define debugvar(x) cout<<#x<<"\t:"<<(x)<<"\n"
    #define debugvec(x) cout<<#x<<"\t:"; for(auto it = (x).begin();it!=(x).end();it++) cout<<*it<<" "; cout<<nl
#else
    #define debugvar(x) 0
    #define debugvec(x) 0
#endif
//Templates
template <typename T> inline T gcd(T a, T b) { a=(a>0?a:-a); b=(b>0?b:-b); while (b != 0) swap(b, a %= b); return a;} 
template <typename T> inline T extended_gcd(T a, T& x, T b, T& y){  // returns gcd(a,b) && a*x + b*y = gcd(a,b)
    T l_a = 1, l_b = 0;
    T r_a = 0, r_b = 1;
    T q = a/b, r = a%b;
    while(r>0){
        T temp;
        temp = r_a, r_a = l_a - q*r_a ,l_a = temp;
        temp = r_b, r_b = l_b - q*r_b ,l_b = temp;
        a = b;
        b = r;
        q = a/b;
        r = a%b;
    }
    x = r_a;
    y = r_b;
    return b;
}
template <typename T> inline T MOD_inv (T num){
    lint inv,temp;
    assert(extended_gcd(MOD,temp,num,inv)==1);
    return (inv%MOD+MOD)%MOD;
}
template <typename T> inline T lcm(T a, T b) { if(a*b==0) return (T)0; return ((a/gcd(a,b))*b);}
template <typename T> inline T getpow(T base, T exp){
    if(exp==0) return (T)1;
    T half  = getpow(base,exp/2); 
    T ans   = half*half; 
    if(exp&1) ans = ans*base;
    return ans;
}
template <typename T> inline T getpowMOD(T base, T exp){
    if(exp==0) return (T)1;
    base    = base%MOD;
    T half  = getpowMOD(base,exp/2);
    T ans   = (half*half)%MOD;
    if(exp&1) ans = (ans*base)%MOD;
    return ans;
}
lint ncrMOD(lint n, lint r){
    if(r>n) return 0;
    r = min(r,n-r);
    lint fact = 1;
    for(lint i=1;i<=r;i++){
        fact=(fact*(n+1-i))%MOD;
        fact=(fact*MOD_inv(i))%MOD;
    }
    return fact;
}
void solve(){
    lint n,m,k;
    cin>>n>>m>>k;
    if(m-n<-k){cout<<0;return;}
    lint ans = ncrMOD(m+n,m)-ncrMOD(m+n,m+k+1);
    ans = (ans+MOD)%MOD;
    cout<<ans;
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);lint testnum=1,totalnum=1;
    //cin>>totalnum;
    for(testnum=1;testnum<=totalnum;++testnum){
        //cout<<"Case #"<<testnum<<": ";
        //cout<<ncrMOD(28,14);
        solve();
        cout<<nl;
    }
    bool time = 0;
    //time=true;
    if(time){
        std::chrono::high_resolution_clock::time_point end_time = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> time_taken = std::chrono::duration_cast<std::chrono::duration<double>>(end_time - start_time);
        cout << "\nTime Taken: " <<setprecision(10)<<time_taken.count() << " s";
    }
return 0;
}
/*
    created on: 27.06.2021                                                                 
    


*/


/*
	JAI JAGANNATH!
*/
//@Author : zanj0

#include<bits/stdc++.h>
using namespace std;

#define int 			long long int
#define ff              first
#define ss              second
#define pb              push_back
#define MOD             1000000007
#define inf             1e18
#define ps(x,y)         fixed<<setprecision(y)<<x
#define w(x)            int x; cin>>x; while(x--)
#define endl       		"\n"
#define timetaken cerr<<"Time : "<<1000*(long double)clock()/(long double)CLOCKS_PER_SEC<<"ms\n"

void zanj0()
{
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
}
const int MAX = 3e6 + 5;
int fac[MAX], finv[MAX];
int inv[MAX];
void COMinit() {
	fac[0] = fac[1] = 1;
	finv[0] = finv[1] = 1;
	inv[1] = 1;
	for (int i = 2; i < MAX; i++) {
		fac[i] = fac[i - 1] * i % MOD;
		inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
		finv[i] = finv[i - 1] * inv[i] % MOD;
	}
}
int COM(int n, int k) {
	if (n < k) return 0;
	if (n < 0 || k < 0) return 0;
	return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
int add(int a, int b) {
	return ((a % MOD) + (b % MOD)) % MOD;
}
int mul(int a, int b) {
	return ((a % MOD) * (b % MOD)) % MOD;
}
int fastPow(int base, int p) {
	int ret = 1;
	while (p) {
		if (p & 1) ret = mul(ret, base);
		base = mul(base, base);
		p >>= 1;
	}
	return ret;
}
int sub(int a, int b) {
	return (((a % MOD) - (b % MOD)) + MOD) % MOD;
}
void solve() {
	int n, m, k;
	cin >> n >> m >> k;
	COMinit();
	if (n > m + k) {
		cout << 0 << endl;
	} else if (k >= n) {
		cout << COM(n + m, n) << endl;
	} else {
		cout << sub(COM(n + m, n), COM(n + m, n - k - 1)) << endl;
	}

}
int32_t main()
{
	zanj0();
	solve();
	timetaken;
	return 0;
}