There are n boys and m girls attending a theatre club. To set a play "The Big Bang Theory", they need to choose a group containing exactly t actors containing no less than 4 boys and no less than one girl. How many ways are there to choose a group? Of course, the variants that only differ in the composition of the troupe are considered different.

Perform all calculations in the 64-bit type: long long for С/С++, int64 for Delphi and long for Java.

Input

The only line of the input data contains three integers n, m, t (4 ≤ n ≤ 30, 1 ≤ m ≤ 30, 5 ≤ t ≤ n + m).

Output

Find the required number of ways.

Please do not use the %lld specificator to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64d specificator.

Examples

Input

5 2 5


Output

10


Input

4 3 5


Output

3
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;


public class YoloSwag {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*
		 * C. The World is a Theatre
		time limit per test2 seconds
		memory limit per test256 megabytes
		inputstandard input
		outputstandard output
		There are n boys and m girls attending a theatre club. To set a play "The Big Bang Theory", they need to choose a group containing exactly t actors containing no less than 4 boys and no less than one girl. How many ways are there to choose a group? Of course, the variants that only differ in the composition of the troupe are considered different.
		
		Perform all calculations in the 64-bit type: long long for С/С++, int64 for Delphi and long for Java.
		
		Input
		The only line of the input data contains three integers n, m, t (4 ≤ n ≤ 30, 1 ≤ m ≤ 30, 5 ≤ t ≤ n + m).
		
		Output
		Find the required number of ways.
		
		Please do not use the %lld specificator to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64d specificator.
		 */
		int numBoys;
		int numGirls;
		int totalActors;
		
		Scanner sc = new Scanner(System.in);
		
		numBoys = sc.nextInt();
		numGirls = sc.nextInt();
		totalActors = sc.nextInt();
		
		HashMap<TriangleLocation, Long> pascal = 
				pascalTriangle(numBoys + numGirls);
				
//		System.out.println(pascal.get(new TriangleLocation(numBoys, numGirls)));
		
		
//		System.out.println("Kevin's test: " +totalActorslistComb(47,13));
//		
//		long oldTotalCombinations = 0L;
//		for(int k = 4; k<=numBoys; k++){
//			if(1 <= (totalActors - k) && (totalActors - k) <= numGirls){
////				System.out.println("n choose k: ("+numBoys+","+k+")=="+listComb(numBoys,k)+"m choose t-k: ("+numGirls+","+(totalActors-k)+")=="+listComb(numGirls,totalActors-k));
//				oldTotalCombinations += (combination(numBoys, k) * combination(numGirls, totalActors-k));
//			}
//		}
//		System.out.println(oldTotalCombinations);
		
//		System.out.println("comb1: "+combination(numBoys, numGirls)+" comb2: "+comb2(numBoys, numGirls));

		long totalCombinations = 0L;
		for(int k = 4; k<=numBoys; k++){
			if(1 <= (totalActors - k) && (totalActors - k) <= numGirls){
//				System.out.println("n choose k: ("+numBoys+","+k+")=="+pascal.get(new TriangleLocation(numBoys,k))
//						+"m choose t-k: ("+numGirls+","+(totalActors-k)+")=="+pascal.get(new TriangleLocation(numGirls,totalActors-k)));
				totalCombinations += (pascal.get(new TriangleLocation(numBoys, k)) * pascal.get(new TriangleLocation(numGirls, totalActors-k)));
			}
		}
		
		
		System.out.println(totalCombinations);
	}
	
	public static long fact(long a){
		if(a == 0){
			return 1;
		}
		return a*fact(a-1);
	}
	
	public static long combination(long top, long bot){
//		System.out.println("top! / bot! (top-bot)! : "+ top+"! / "+bot+"! ("+(top-bot)+")!");
//		System.out.println("top! / bot! (top-bot)! : "+ fact(top)+" / "+fact(bot)+" ("+fact(top-bot)+")");
		return (fact(top) / (fact(bot) * fact(top-bot)));
	}
	
	public static long comb2(long top, long bot){
		long tot = 1L;
		//Calculate top! / bot! or top! / (top-bot)!, depending on which denomin is higher
		long higherOne = (bot > (top-bot)) ? bot : top-bot;
		long lowerOne = (bot > (top-bot)) ? top-bot : bot;
		
		for(long countdown = top; countdown>higherOne; countdown--){
			tot *= countdown;
		}
		
		tot /= fact(lowerOne);
		
		return tot;
		
	}
	
	public static long listComb(long top, long bot){
		//List-based combination. Let's kick ass maybe?
		List<Long> numeratorValues = new ArrayList<Long>();
		List<Long> denominatorValues = new ArrayList<Long>();
		
		for(long genNumer = 1L+bot; genNumer <= top; genNumer++){
			numeratorValues.add(genNumer);
		}
		
		for(long genDenom = 2; genDenom <= top-bot; genDenom++){//TODO works for bot == 0?
			denominatorValues.add(genDenom);
		}
		
		//Eliminate factors until denominatorValues is empty
		//Start with duplicates:
		
		System.out.println("Numerator Values: "+numeratorValues);
		System.out.println("Denominator Values: "+denominatorValues);
		int i = 0, j = 0;
		while(i < numeratorValues.size() && j < denominatorValues.size()){
			if(denominatorValues.get(j) == numeratorValues.get(i)){
				denominatorValues.remove(j);
				numeratorValues.remove(i);
				
			}else{
				j++;
			}
		}
		System.out.println("Numerator Values: "+numeratorValues);
		System.out.println("Denominator Values: "+denominatorValues);
		//Whatever's left in denominatorValues? Search numeratorValues for a factorable value and nuke it.
		for(int back = denominatorValues.size()-1; back>=0; back--){
			Long l = denominatorValues.get(back);
			boolean weFoundIt = false;
			for(i = 0; i<numeratorValues.size(); i++){
				System.out.println("Does "+numeratorValues.get(i)+" divide by "+l);
				if(numeratorValues.get(i) % l == 0){
					numeratorValues.set(i, numeratorValues.get(i) / l);
					weFoundIt = true;
					break;
				}
			}
			if(!weFoundIt){
				System.out.println("Failed on "+l);
				return -1L; // We done goofed
			}
		}
		
		long tot = 1L;
		for(Long l : numeratorValues){
			tot *= l;
		}
		return tot;
	}
	
	public static HashMap<TriangleLocation, Long> pascalTriangle(int desHeight){
		HashMap<TriangleLocation, Long> tri = new HashMap<TriangleLocation, Long>();
		tri.put(new TriangleLocation(0,0), 1L);
		int maxOffset = 1;
		int curHeight = 1;
		while(curHeight <= desHeight){
			for(int off = 0; off<=maxOffset; off++){
				Long nextValue = (off-1 == -1 ? 0 : tri.get(new TriangleLocation(curHeight-1, off-1)))
						+ (off == maxOffset ? 0 : tri.get(new TriangleLocation(curHeight-1, off)));
				tri.put(new TriangleLocation(curHeight, off), nextValue);
			}
			curHeight++;
			maxOffset++;
		}
		return tri;
	}
	
	
}

class TriangleLocation{
	int height;
	int offset;
	
	TriangleLocation(int h, int o){
		height = h;
		offset = o;
	}
	
	@Override
	public boolean equals(Object o){
		TriangleLocation t = (TriangleLocation) o;
		return this.offset == t.offset && this.height == t.height;
	}
	
	@Override
	public int hashCode(){
		return (height+" "+offset).hashCode();
	}
}
