/*Jai Shree Ram*/
// Never Give Up
/*自分を信じない人にとっては、一生懸命働くことは無意味です*/

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
 
#define ff              first
#define ss              second
#define int             long long
#define pb              push_back
#define mp              make_pair
#define pii             pair<int,int>
#define vi              vector<int>
#define mii             map<int,int>
#define umii            unordered_map<int,int>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int> >
#define setbits(x)      __builtin_popcountll(x)
#define zrobits(x)      __builtin_ctzll(x)
#define mod             1000000007
#define inf             1e18
#define ps(x,y)         fixed<<setprecision(y)<<x
#define mk(arr,n,type)  type *arr=new type[n];
#define w(x)            int x; cin>>x; while(x--)
#define F(i,s,e,j)        for(int i=s;i<=e;i+=j)
#define mt19937                 rng(chrono::steady_clock::now().tjhe_since_epoch().count());   
//shuffle(arr,arr+n,rng)
/*---------------------------------------------------------------------------------------------------------------------------*/
int gcd(int a, int b) {if (b > a) {return gcd(b, a);} if (b == 0) {return a;} return gcd(b, a % b);}
int expo(int a, int b,int m) {int res = 1; while (b > 0) {if (b & 1)res = (res * a) % m; a = (a * a) % m; b = b >> 1;} return res;}
void extendgcd(int a, int b, int*v) {if (b == 0) {v[0] = 1; v[1] = 0; v[2] = a; return ;} extendgcd(b, a % b, v); int x = v[1]; v[1] = v[0] - v[1] * (a / b); v[0] = x; return;} //pass an arry of size1 3
int mminv(int a, int b) {int arr[3]; extendgcd(a, b, arr); return arr[0];} //for non prime b
int mminvprime(int a, int b) {return expo(a, b - 2, b);}
void swap(int &x, int &y) {int temp = x; x = y; y = temp;}
int combination(int n, int r, int m, int*fact, int *ifact) {int val1 = fact[n]; int val2 = ifact[n - r]; int val3 = ifact[r]; return (((val1 * val2) % m) * val3) % m;}
void google(int t) {cout << "Case #" << t << ": ";}
vi sieve(int n) {int*arr = new int[n + 1](); vi vect; for (int i = 2; i <= n; i++)if (arr[i] == 0) {vect.push_back(i); for (int j = 2 * i; j <= n; j += i)arr[j] = 1;} return vect;}
int mod_add(int a, int b, int m) {a = a % m; b = b % m; return (((a + b) % m) + m) % m;}
int mod_mul(int a, int b, int m) {a = a % m; b = b % m; return (((a * b) % m) + m) % m;}
int mod_sub(int a, int b, int m) {a = a % m; b = b % m; return (((a - b) % m) + m) % m;}
int mod_div(int a, int b, int m) {a = a % m; b = b % m; return (mod_mul(a, mminvprime(b, m), m) + m) % m;}  //only for prime m
int phin(int n) {int number = n; if (n % 2 == 0) {number /= 2; while (n % 2 == 0) n /= 2;} for (int i = 3; i <= sqrt(n); i += 2) {if (n % i == 0) {while (n % i == 0)n /= i; number = (number / i * (i - 1));}} if (n > 1)number = (number / n * (n - 1)) ; return number;} //O(sqrt(N))
/*--------------------------------------------------------------------------------------------------------------------------*/
 void c_p_c()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
}
const int MAXN = 2000000;
int fact[MAXN+1];
int inv_fact[MAXN+1];
void pre_compute()
{
    fact[0] = 1;
    for(int i=1;i<=MAXN;i++)
        fact[i] = mod_mul(i,fact[i-1],mod);
    inv_fact[0] = 1;
    for(int i=1;i<=MAXN;i++)
        inv_fact[i] = mod_mul(mminv(i,mod),inv_fact[i-1],mod);
}
int combination(int i,int j)
{
    int ans = fact[i];
    ans = mod_mul(ans,inv_fact[j],mod);
    ans = mod_mul(ans,inv_fact[i-j],mod);
    return ans;
}
int32_t main()
{  
   c_p_c();
   pre_compute();
   int n,m,k;
   cin>>n>>m>>k;
   if(n>m+k)
    cout<<0<<endl;
   else
   {
      int ans = (combination(m+n,m)-combination(n+m,n-k-1)+mod)%mod;
      cout<<ans<<"\n";
   }
} 
#include <bits/stdc++.h>
using namespace std;
#define fastio                        \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL)
#define int long long
#define ll long long
#define ld long double
#define all(v) v.begin(), v.end()
#define endl "\n"
const ll inf = 1e18;
const ll mod = 1e9 + 7;
const ll MAX = 2e6 + 5;
inline ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll add(ll a, ll b) { return ((a % mod) + (b % mod)) % mod; }
inline ll mul(ll a, ll b) { return ((a % mod) * (b % mod)) % mod; }
inline ll sub(ll a, ll b) { return ((a % mod) - (b % mod) + mod) % mod; }
inline ll power(ll x, ll n) {
    if (!n) {
        return 1;
    }
    return (n & 1 ? mul(x, power(mul(x, x), n / 2)) : power(mul(x, x), n / 2));
}
int ways = 0;
void rec(int i, int j, int n, int m, int k, vector<char> a) {
    if (i + j == n + m) {
        int wi = 0, bi = 0;
        bool ok = true;
        for (int i = 0; i < n + m; i++) {
            wi += a[i] == 'w';
            bi += a[i] == 'b';
            ok &= (wi <= bi + k);
        }
        ways += ok;
        return;
    }
    if (i < n) {
        a.push_back('w');
        rec(i + 1, j, n, m, k, a);
        a.pop_back();
    }
    if (j < m) {
        a.push_back('b');
        rec(i, j + 1, n, m, k, a);
        a.pop_back();
    }
}
vector<int> fact(MAX, 1);
void pre() {
    for (int i = 1; i < MAX; i++) fact[i] = mul(i, fact[i - 1]);
}
int ncr(int n, int r) {
    if (r > n) return 0LL;
    return mul(fact[n], mul(power(fact[r], mod - 2), power(fact[n - r], mod - 2)));
}
// 7 4 0
// 0 0
// 0 1
// 0 2
// 165 3
// 275 4
// 319 5
// 329 6
// 330 7
// 330 8
// 330 9
// 330 10
// 330 11

// 4 7 0
// 165 0
// 275 1
// 319 2
// 329 3
// 330 4
// 330 5
// 330 6
// 330 7
// 330 8
// 330 9
// 330 10
// 330 11
void solve() {
    pre();
    int n, m, k;
    cin >> n >> m >> k;
    if (n > m) {
        if (k >= n) {
            cout << ncr(n + m, n) << endl;
        } else {
            int diff = n - k;
            if (diff > m) {
                cout << 0 << endl;
            } else {
                cout << sub(ncr(n + m, n), ncr(n + m, diff - 1)) << endl;
            }
        }
    } else {
        if (k >= n) {
            cout << ncr(n + m, n) << endl;
        } else {
            cout << sub(ncr(n + m, n), ncr(n + m, n - k - 1)) << endl;
        }
    }
    // for (int k = 0; k <= n + m; k++) {
    //     vector<char> a;
    //     ways = 0;
    //     rec(0, 0, n, m, k, a);
    //     cout << ways << " " << k << endl;
    // }
}

signed main() {
    fastio;

    int t = 1;
    // cin >> t;

    while (t--) {
        solve();
    }
    return 0;
}