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: Wrong Answer)

import java.util.*;

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

	int MOD = 1000000007;

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

		int NM= N*M;
		long ans = f(NM, N, M, K);
		ans += f(NM, M, N, K);
		ans %= MOD;
		System.out.println(ans);
		sc.close();
	}

	public long f(int nm, int n, int m, int k) {
		long ans = 0;
		for(int i=1; i<n; i++) {
			long tmp = i * (n-i);
			tmp %= MOD;
			ans += tmp;
			ans %= MOD;
		}
		ans = ans * (m*m);
		ans %= MOD;
		ans *= choose(nm-2, k-2);
		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, int 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);
	}
}