#include <bits/stdc++.h>
using namespace std;
const int MAXINT = 100010;
const int MAXNODE = 100010;
const int MAXEDGE = 2 * MAXNODE;
char BUF, *buf;
int read() {
  char c = getchar();
  int f = 1, x = 0;
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return f * x;
}
char get_ch() {
  char c = getchar();
  while (!isalpha(c)) c = getchar();
  return c;
}
long long cnt_t, cnt_g;
long long fact[100010], df[100010];
long long f, w, h;
long long fp(long long b, long long u) {
  long long ans = 1;
  for (; u; b = b * b % 1000000007, u >>= 1)
    if (u & 1) ans = ans * b % 1000000007;
  return ans;
}
long long C(long long n, long long m) {
  if (m > n) return 0;
  return (fact[n] * df[m] % 1000000007) * df[n - m] % 1000000007;
}
void add(long long &a, long long b) { a = (a + b) % 1000000007; }
void get_input();
void work();
int main() {
  get_input();
  work();
  return 0;
}
void work() {
  fact[0] = 1;
  for (int i = 1; i <= 100000; ++i) fact[i] = fact[i - 1] * i % 1000000007;
  for (int i = 0; i < 100001; ++i) df[i] = fp(fact[i], 1000000007 - 2);
  for (int i = 1; 1; i++) {
    if (i > f + w || i > min(f, w) * 2 + 1) break;
    if (i == 1) {
      if (f == 0 || w == 0) cnt_t++;
      if (w == 0 || (f == 0 && w > h)) cnt_g++;
    } else {
      if (i & 1) {
        add(cnt_t, C(f - 1, i / 2) * C(w - 1, i / 2 - 1));
        add(cnt_t, C(f - 1, i / 2 - 1) * C(w - 1, i / 2));
        add(cnt_g, C(f - 1, i / 2) * C(w - 1 - i / 2 * h, i / 2 - 1));
        add(cnt_g, C(f - 1, i / 2 - 1) * C(w - 1 - (i / 2 + 1) * h, i / 2));
      } else {
        add(cnt_t,
            (C(f - 1, i / 2 - 1) * C(w - 1, i / 2 - 1) % 1000000007) * 2);
        add(cnt_g, (C(f - 1, i / 2 - 1) * C(w - 1 - (i / 2) * h, i / 2 - 1) %
                    1000000007) *
                       2);
      }
    }
  }
  printf("%lld\n", cnt_g * fp(cnt_t, 1000000007 - 2) % 1000000007);
}
void get_input() {
  f = read();
  w = read();
  h = read();
}
