#include <bits/stdc++.h>
using namespace std;
void judge() { return; }
bool compare(long long int x, long long int y) { return x > y; }
long long int powerlong(long long int base, long long int exponent,
                        long long int modulus) {
  long long int k = 1;
  while (exponent) {
    if (exponent & 1 == 1) {
      k = (k * base) % modulus;
      exponent--;
      continue;
    }
    exponent = exponent / 2;
    base = (base * base) % modulus;
  }
  return k;
}
long long int nCr(long long int n, long long int r, long long int modulo) {
  if (n == r || r == 0) {
    return (long long int)1;
  }
  if (r > n - r) {
    r = n - r;
  }
  long long int k = ((nCr(n - 1, r - 1, modulo)) % modulo +
                     (nCr(n - 1, r, modulo) % modulo)) %
                    modulo;
  return k;
}
long long int fact[200005] = {0};
bool initialize = false;
long long int nCrinv(long long int n, long long int r, long long int modulo) {
  if (!initialize) {
    fact[0] = 1;
    for (long long int i = 1; i <= n; i++) {
      fact[i] = (fact[i - 1] * i) % modulo;
    }
    initialize = true;
  }
  long long int k = fact[n],
                x = (fact[n - r] * fact[r]) % (long long int)1000000007;
  long long int res = (k * powerlong(x, (long long int)1000000007 - 2,
                                     (long long int)1000000007)) %
                      (long long int)1000000007;
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  judge();
  long long int t = 1;
  while (t--) {
    long long int i = 0, j = (long long int)1000000007, k = 0, l = 0, z = 0;
    long long int n, m = 0;
    cin >> n >> m >> z;
    if (n == 0 && m == 0) {
      cout << "0" << endl;
      continue;
    }
    if (n == 0 || m == 0) {
      if (n == 0) {
        if (z == 0) {
          if (m == 1) {
            cout << "0" << endl;
            continue;
          } else {
            cout << "1" << endl;
            continue;
          }
        } else {
          if (m == 1) {
            cout << "1" << endl;
            continue;
          } else {
            cout << "0" << endl;
            continue;
          }
        }
      }
      if (m == 0) {
        if (z == 0) {
          if (n % 2 == 1) {
            cout << "1" << endl;
            continue;
          } else {
            cout << "0" << endl;
            continue;
          }
        } else {
          if (n % 2 == 1) {
            cout << "0" << endl;
            continue;
          } else {
            cout << "1" << endl;
            continue;
          }
        }
      }
    }
    l = nCrinv(n + m, m, (long long int)1000000007);
    k = 0;
    if (n > 0 && m > 0) {
      while (n > 0 && m > 0) {
        k += nCrinv(n + m - 1, m - 1, (long long int)1000000007);
        k = k % (long long int)1000000007;
        if (n >= 2) {
          n = n - 2;
        } else {
          break;
        }
      }
      if (n == 0 && m > 1) {
        k += 1;
      }
      if (n == 1 && m == 1) {
        k += 1;
      }
    }
    if (z == 0) {
      cout << k << endl;
    } else {
      l = (l - k + (long long int)1000000007) % (long long int)1000000007;
      cout << l << endl;
    }
  }
}
