Problem:
Score : 500 points

Problem Statement

We have a grid of squares with N rows and M columns. Let (i, j) denote the square at the i-th row from the top and j-th column from the left. We will choose K of the squares and put a piece on each of them.

If we place the K pieces on squares (x_1, y_1), (x_2, y_2), ..., and (x_K, y_K), the cost of this arrangement is computed as:

\sum_{i=1}^{K-1} \sum_{j=i+1}^K (|x_i - x_j| + |y_i - y_j|)

Find the sum of the costs of all possible arrangements of the pieces. Since this value can be tremendous, print it modulo 10^9+7.

We consider two arrangements of the pieces different if and only if there is a square that contains a piece in one of the arrangements but not in the other.

Constraints

2 \leq N \times M \leq 2 \times 10^5

2 \leq K \leq N \times M

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M K

Output

Print the sum of the costs of all possible arrangements of the pieces, modulo 10^9+7.

Sample Input 1

2 2 2

Sample Output 1

8

There are six possible arrangements of the pieces, as follows:

((1,1),(1,2)), with the cost |1-1|+|1-2| = 1

((1,1),(2,1)), with the cost |1-2|+|1-1| = 1

((1,1),(2,2)), with the cost |1-2|+|1-2| = 2

((1,2),(2,1)), with the cost |1-2|+|2-1| = 2

((1,2),(2,2)), with the cost |1-2|+|2-2| = 1

((2,1),(2,2)), with the cost |2-2|+|1-2| = 1

The sum of these costs is 8.

Sample Input 2

4 5 4

Sample Output 2

87210

Sample Input 3

100 100 5000

Sample Output 3

817260251

Be sure to print the sum modulo 10^9+7.

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)


import java.util.*;

public class Main {
	public static void main(String[] args) {
		Main main = new Main();
		main.run();
	}

	long  MOD = 1000000007L;

	public void run() {
		Scanner sc = new Scanner(System.in);
		int N=sc.nextInt();
		int M=sc.nextInt();
		int K=sc.nextInt();

		long NM= (N*M)%MOD;
		long ans = f(NM, N, M, K);
		ans += f(NM, M, N, K);
		ans %= MOD;
		long cnt = choose(NM-2, K-2);
		ans *= cnt;
		ans %= MOD;

		System.out.println(ans);
		sc.close();
	}

	public long f(long nm, int n, int m, int k) {
		long ans = 0;
		for(long i=1; i<n; i++) {
			long tmp = i * (n-i) % MOD;
			tmp %= MOD;
			ans += tmp;
			ans %= MOD;
			//System.out.println(ans);
		}
		ans = ans*m*m;
		ans %= MOD;
		return ans;
	}

	public long choose(long n, int k) {
		return fact(n) * inv(fact(n-k)) % MOD * inv(fact(k)) % MOD;
	}

	public long fact(long x) {
		long ans = 1;
		for(long i=x; i>0; i--) {
			ans *= i;
			ans %= MOD;
		}
		return ans;
	}

	public long pow(long n, long x) {
		if(x==0) return 1;
		long tmp = pow(n, x/2);
		long ans = 0;
		if(x%2==0) {
			ans = tmp * tmp % MOD;
		}else {
			ans = tmp * tmp % MOD * n % MOD;
		}
		return ans;
	}

	public long inv(long x) {
		return pow(x, MOD-2);
	}
}