#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <ctime>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <cstring>
#include <numeric>
#include <cassert>
using namespace std;
static const double EPS = 1e-10;
typedef long long ll;
#define rep(i,n) for(int i=0;i<n;i++)
#define rev(i,n) for(int i=n-1;i>=0;i--)
#define all(a) a.begin(),a.end()
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define SS stringstream
#define DBG1(a) rep(_X,sz(a)){printf("%d ",a[_X]);}puts("");
#define DBG2(a) rep(_X,sz(a)){rep(_Y,sz(a[_X]))printf("%d ",a[_X][_Y]);puts("");}
#define bitcount(b) __builtin_popcount(b)
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)

#define delete(a,n) a.erase(remove(all(a),n),a.end())
template<typename T, typename S> vector<T>& operator<<(vector<T>& a, S b) { a.push_back(b); return a; }
template<typename T> void operator>>(vector<T>& a, int b) {while(b--)if(!a.empty())a.pop_back();}
bool isprime(int n){ if(n<2)return false;  for(int i=2;i*i<=n;i++)if(n%i==0)return false;  return true;} 
ll b_pow(ll x,ll n){return n ? b_pow(x*x,n/2)*(n%2?x:1) : 1ll;}
string itos(long long n){stringstream ss;ss << n;return ss.str();}

typedef unsigned int uint;
int in() {
    int x = 0, c;
    for (; (uint)((c = getchar()) - '0') >= 10; ) { if (c == '-') return -in(); if (!~c) throw ~0; }
    do { x = (x << 3) + (x << 1) + (c - '0'); } while ((uint)((c = getchar()) - '0') < 10);
    return x;
}

int cnt[30001];

class bigInteger{
#define DIGITMAX (800) // 8 * n digit
public:
	std::vector<long long> value;
 
	bigInteger operator=(bigInteger b){
		this->value = b.value;
		return *this;
	}
	/* O(n) */
	bigInteger operator+(bigInteger b){
		for(int i=0;i<DIGITMAX;i++){
			b.value[i] += this->value[i];
			if(b.value[i]>=100000000){
				b.value[i] -= 100000000;
				b.value[i+1]++;
			}
		}
		return b;
	}
	/* O(n) */
	bigInteger operator-(bigInteger b){
		for(int i=0;i<DIGITMAX;i++){
			b.value[i] = this->value[i] - b.value[i];
			if(b.value[i]<0){
				b.value[i] = 100000000+b.value[i];
				b.value[i+1]++; // b wo oome
			}
		}
		return b;
	}
	/* with bug.. O(n^2) */
	// MiniNum * BigNum
	bigInteger operator*(bigInteger b){
		bigInteger ret;
		for(int i=0;i<DIGITMAX;i++){
			if( this->value[i] == 0 ) continue;
			for(int j=0;j<DIGITMAX;j++){
				if(i+j+1<DIGITMAX){
					ret.value[i+j] += this->value[i]*b.value[j];
					ret.value[i+j+1] += ret.value[i+j]/100000000;
					ret.value[i+j] %= 100000000;
				}
			}
		}
		return ret;
	}
 
	string str(){
		char tmp[9];
		string retVal = "";
		for(int i=DIGITMAX-1;i>=0;i--){
			sprintf(tmp,"%08lld",value[i]);
			retVal += tmp;
		}
		while(retVal[0] == '0' && retVal.length()>=2)retVal = retVal.substr(1);
		return retVal;
	}
 
	bigInteger(){this->value.resize(DIGITMAX);}
	bigInteger(string init){
		vector<long long> vi;
		for(int i=init.length()-8;i>-8;i-=8){
			vi.push_back( atoi(init.substr(max(i,0),8+(i<0?i:0)).c_str()) );
		}
		this->value = vi;
		this->value.resize(DIGITMAX);
	}
};

int main(){
	int n = in() , m = in() , r = in();
	int R = r - n * m;
	if( R < 0 ){
		cout << 0 << endl;
		return 0;
	}
	// R=2,R=3 |O|O -> (R+n-1) C (n-1)
	for(int i_ = 0 ; i_ < n-1 ; i_++){
		int N = n-1+R-i_;
		int i = 2;
		while(i*i<=N){
			if(N%i==0) cnt[i]++ , N/=i , i = 2;
			else i++;
		}
		cnt[N]++;
	}
	for(int i_ = 0 ; i_ < n-1 ; i_++){
		int N = i_+1;
		int i = 2;
		while(i*i<=N){
			if(N%i==0) cnt[i]-- , N/=i , i = 2;
			else i++;
		}
		cnt[N]--;
	}
	bigInteger ans("1");
	for(int i = 2 ; i <= 30000 ; i++){
		//if( cnt[i] )cout << i << " " << cnt[i] << endl;
		while( cnt[i]-- ) ans = bigInteger( itos(i) ) * ans;
	}
	cout << ans.str() << endl;
}
	

Measured memory_bytes: 1416