#include <bits/stdc++.h>
using namespace std;
const long long maxN = 3e5 + 5, mod = 1e9 + 7;
long long binpow(long long a, long long n, long long res = 1) {
  while (n > 0) {
    if (n & 1)
      (res *= a) %= mod, n--;
    else
      (a *= a) %= mod, n >>= 1;
  }
  return res;
}
long long inverse(long long x) { return binpow(x, mod - 2); }
long long fact[maxN], inv[maxN], ansF[maxN], ansW[maxN];
long long nCk(long long n, long long k) {
  if (k > n) return 0;
  return ((fact[n] * inv[k]) % mod) * inv[n - k] % mod;
}
void preset() {
  memset(ansF, 0, sizeof(ansF));
  memset(ansW, 0, sizeof(ansW));
  fact[0] = 1, inv[0] = 1;
  for (long long i = 1; i < maxN; i++) {
    fact[i] = (fact[i - 1] * i) % mod;
    inv[i] = (inv[i - 1] * inverse(i)) % mod;
  }
}
signed main() {
  long long f, w, h;
  cin >> f >> w >> h;
  preset();
  for (long long k = 1; k < maxN; k++) {
    ansF[k] = nCk(f - 1, k - 1);
  }
  for (long long k = 1; k < maxN; k++) {
    ansW[k] = nCk(w - k * h - 1, k - 1);
  }
  long long satisfy = 0, total = 0;
  for (long long i = 1; i <= max(f, w); i++) {
    satisfy += (ansW[i] * ansF[i + 1] + ansW[i + 1] * ansF[i] +
                2 * ansW[i] * ansF[i]) %
               mod;
    satisfy %= mod;
  }
  for (long long i = 1; i <= max(f, w); i++) {
    long long c1 = nCk(w - 1, i - 1) * nCk(f - 1, i);
    long long c2 = nCk(f - 1, i - 1) * nCk(w - 1, i);
    long long c3 = 2 * nCk(w - 1, i - 1) * nCk(f - 1, i - 1);
    (total += c1 + c2 + c3) %= mod;
  }
  if ((w > h && f == 0) || (w == 0 && f != 0)) {
    cout << 1;
    return 0;
  }
  cout << satisfy * inverse(total) % mod;
}
