#include <iostream>
#include <iomanip>
#include <string>
#include <cassert>
#include <cstring>
#include <algorithm>

using namespace std;

using Int = long long;
constexpr Int B = 10000000000; // base (power of 10)
constexpr int WIDTH = 10;         // log B
constexpr int MAXDIGIT = 2000; // it can represent BW*MAXDIGIT digits (in base 10)
struct bint {
    Int digit[MAXDIGIT];
    int size;
    bint(int size, Int a) : size(size) {
        memset(digit, 0, sizeof(digit));
        digit[0] = a;
    }
    bint(Int a);
    bint(const string &s);
};

static const bint ZERO(1, 0), ONE(1, 1);
inline bool operator<(const bint & x, const bint & y) {
    if (x.size != y.size) return x.size < y.size;
    for (int i = x.size - 1; i >= 0; --i)
        if (x.digit[i] != y.digit[i]) return x.digit[i] < y.digit[i];
    return false;
}
inline bool operator >(const bint & x, const bint &  y) { return y < x; }
inline bool operator<=(const bint &  x, const bint &  y) { return !(y < x); }
inline bool operator>=(const bint &  x, const bint &  y) { return !(x < y); }
inline bool operator!=(const bint &  x, const bint &  y) { return x < y || y < x; }
inline bool operator==(const bint &  x, const bint &  y) { return !(x < y) && !(y < x); }

// Utilities
inline bint normal(bint x) {
    Int c = 0;
    for (int i = 0; i < x.size; ++i) {
        while (x.digit[i] < 0)
            x.digit[i + 1] -= 1, x.digit[i] += B;
        Int a = x.digit[i] + c;
        x.digit[i] = a % B;
        c = a / B;
    }
    for (; c > 0; c /= B) x.digit[x.size++] = c % B;
    while (x.size > 1 && x.digit[x.size - 1] == 0) --x.size;
    return x;
}
bint::bint(Int a) { *this = normal(bint(1, a)); }
bint::bint(const string &s) {
    bint x(1, 0);
    int i = s.size() % WIDTH;
    if (i > 0) i -= WIDTH;
    for (; i < (int)s.size(); i += WIDTH) {
        Int a = 0;
        for (int j = 0; j < WIDTH; ++j)
            a = 10 * a + (i + j >= 0 ? s[i + j] - '0' : 0);
        x.digit[x.size++] = a;
    }
    reverse(x.digit, x.digit + x.size);
    *this = normal(x);
}

// Input/Output
ostream &operator << (ostream &os, const bint & x) {
    os << x.digit[x.size - 1];
    for (int i = x.size - 2; i >= 0; --i) os << setw(WIDTH) << setfill('0') << x.digit[i];
    return os;
}
istream &operator >> (istream &is, bint &x) {
    string s; is >> s; x = bint(s); return is;
}

// Basic Operations 
inline bint operator+(bint x, const bint & y) {
    if (x.size < y.size) x.size = y.size;
    for (int i = 0; i < y.size; ++i) x.digit[i] += y.digit[i];
    return normal(x);
}
inline bint operator-(bint x, const bint & y) {
    assert(x >= y);
    for (int i = 0; i < y.size; ++i) x.digit[i] -= y.digit[i];
    return normal(x);
}
inline bint operator*(bint x, const bint & y) {
    bint z(x.size + y.size, 0);
    for (int i = 0; i < x.size; ++i)
        for (int j = 0; j < y.size; ++j)
            z.digit[i + j] += x.digit[i] * y.digit[j];
    return normal(z);
}
inline bint operator*(bint x, Int a) {
    for (int i = 0; i < x.size; ++i) x.digit[i] *= a;
    return normal(x);
}
inline pair<bint, Int> divmod(bint x, Int a) {
    Int c = 0, t;
    for (int i = x.size - 1; i >= 0; --i) {
        t = B * c + x.digit[i];
        x.digit[i] = t / a;
        c = t % a;
    }
    return pair<bint, Int>(normal(x), c);
}
inline bint operator/(bint x, Int a) { return divmod(x, a).first; }
inline Int operator%(bint x, Int a) { return divmod(x, a).second; }
inline pair<bint, bint> divmod(bint x, bint y) {
    if (x.size < y.size) return pair<bint, bint>(ZERO, x);
    int F = B / (y.digit[y.size - 1] + 1); // multiplying good-factor
    x = x * F; y = y * F;
    bint z(x.size - y.size + 1, 0);
    for (int k = z.size - 1, i = x.size - 1; k >= 0; --k, --i) {
        z.digit[k] = (i + 1 < x.size ? x.digit[i + 1] : 0) * B + x.digit[i];
        z.digit[k] /= y.digit[y.size - 1];
        bint t(k + y.size, 0);
        for (int m = 0; m < y.size; ++m) t.digit[k + m] = z.digit[k] * y.digit[m];
        t = normal(t);
        while (x < t) {
            z.digit[k] -= 1;
            for (int m = 0; m < y.size; ++m) t.digit[k + m] -= y.digit[m];
            t = normal(t);
        }
        x = x - t;
    }
    return pair<bint, bint>(normal(z), x / F);
}
inline bint operator/(bint x, bint y) { return divmod(x, y).first; }
inline bint operator%(bint x, bint y) { return divmod(x, y).second; }

// Advanced Operations
inline bint shift(bint x, int k) {
    if (x.size == 1 && x.digit[0] == 0) return x;
    x.size += k;
    for (int i = x.size - 1; i >= k; --i) x.digit[i] = x.digit[i - k];
    for (int i = k - 1; i >= 0; --i) x.digit[i] = 0;
    return x;
}
inline bint sqrt(const bint & x) { // verified UVA 10023
    const bint _20(2 * B);
    bint odd = ZERO;
    bint rem(2, 0);
    bint ans = ZERO;
    for (int i = 2 * ((x.size - 1) / 2); i >= 0; i -= 2) {
        int group = (i + 1 < x.size ? x.digit[i + 1] : 0) * B + x.digit[i];
        odd = _20 * ans + ONE;
        rem = shift(rem, 2) + bint(group);
        int count = 0;
        while (rem >= odd) {
            count = count + 1;
            rem = rem - odd;
            odd.digit[0] += 2;
            odd = normal(odd);
        }
        ans = shift(ans, 1) + bint(count);
    }
    return ans;
}


int main() {
    int n, m, r;
    while (cin >> n >> m >> r) {
        int x = r - n*m + n - 1;
        int y = r - m * n;
        bint ans(1, 0);
        if (y < 0 || x < 0) ans = ZERO;
        else
        {
            ans = bint(1);
            for (int i = 1; i <= y; i++) {
                ans = ans * (x - i + 1);
                ans = ans / i;
            }
        }
        cout << ans << endl;
    }
}

Measured memory_bytes: 3364