Bizon the Champion isn't just charming, he also is very smart.

While some of us were learning the multiplication table, Bizon the Champion had fun in his own manner. Bizon the Champion painted an n × m multiplication table, where the element on the intersection of the i-th row and j-th column equals i·j (the rows and columns of the table are numbered starting from 1). Then he was asked: what number in the table is the k-th largest number? Bizon the Champion always answered correctly and immediately. Can you repeat his success?

Consider the given multiplication table. If you write out all n·m numbers from the table in the non-decreasing order, then the k-th number you write out is called the k-th largest number.

Input

The single line contains integers n, m and k (1 ≤ n, m ≤ 5·105; 1 ≤ k ≤ n·m).

Output

Print the k-th largest number in a n × m multiplication table.

Examples

Input

2 2 2


Output

2


Input

2 3 4


Output

3


Input

1 10 5


Output

5

Note

A 2 × 3 multiplication table looks like this:
    
    
      
    1 2 3  
    2 4 6  
      
    
import java.io.*; 
import java.util.*; 

public class p6{

	static class FastReader{ 
		BufferedReader br; 
		StringTokenizer st; 

		public FastReader() 
		{ 
			br = new BufferedReader(new
					InputStreamReader(System.in)); 
		} 

		String next() 
		{ 
			while (st == null || !st.hasMoreElements()) 
			{ 
				try
				{ 
					st = new StringTokenizer(br.readLine()); 
				} 
				catch (IOException e) 
				{ 
					e.printStackTrace(); 
				} 
			} 
			return st.nextToken(); 
		} 

		int nextInt() 
		{ 
			return Integer.parseInt(next()); 
		} 

		long nextLong() 
		{ 
			return Long.parseLong(next()); 
		} 

		double nextDouble() 
		{ 
			return Double.parseDouble(next()); 
		} 

		String nextLine() 
		{ 
			String str = ""; 
			try
			{ 
				str = br.readLine(); 
			} 
			catch (IOException e) 
			{ 
				e.printStackTrace(); 
			} 
			return str; 
		} 
	}

	static long ceil(long a, long b){
		if(a%b==0)
			return a/b;
		return (a/b)+1;
	}

	static long check(long mid, long n, long m, long k){
		long max = 0, min = 0;
		for(long i=1;i<=n;i++){
			if(mid >= i){
				max += Math.min(m, mid/i) ;
				min += Math.min(m, (ceil(mid, i) - 1)) ;
			}else{
				break;
			}
		}

		// System.out.println(mid+" "+max+" "+min);

		if(max>=k && k>min)
			return k;
		else 
			return max;
	}

	static long next(long val, long n, long m){
		long res = 0;
		for(int i=1;i<=n;i++){
			long cur = Math.min(val/i, m) *i;
			res = Math.max(cur, res);
		}
		return res;
	}

	static long search(long l, long r, long k, long n, long m){
		while(l<=r){
			long mid = l + (r-l)/2;
			long val = check(mid, n, m, k);
			if(val==k)
				return next(mid, n, m);
			else if(val>k)
				r = mid-1;
			else
				l = mid+1;
		}
		return -1L;
	}

	public static void main(String[] args) 
	{ 
		FastReader sc = new FastReader();
		
		long n = sc.nextLong();
		long m = sc.nextLong();
		long k = sc.nextLong();

		System.out.println( search(1, n*m, k, n, m) );
	}
}