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 C (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#define MAX 200010
#define MOD 1000000007

long long int fac[MAX]={0};
long long int inv[MAX]={0};
long long int finv[MAX]={0};
int i;

void comb_init()
{
	fac[0]=1;
	fac[1]=1;
	finv[0]=1;
	finv[1]=1;
	inv[1]=1;
	for(i=2;i<MAX;i++)
	{
		fac[i]=fac[i-1]*i%MOD;
		inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD;
		finv[i]=finv[i-1]*inv[i]%MOD;
	}
}


long long int comb(int n,int k)
{
	if(n<k)return 0;
	if(n<0||k<0)return 0;
	return fac[n]*(finv[k]*finv[n-k]%MOD)%MOD;
}

long long int tetra(int n)
{
	long long int lln=(long long int)n;
	return (lln*(lln+1)*(lln+2)/6)%MOD;
}

int main()
{
	int n,m,k;
	
	long long int ans,a,b;
	scanf("%d %d %d",&n,&m,&k);
	comb_init();
	a=((tetra(m-1)*n)%MOD*n)%MOD;
	//printf("%d\n",((tetra(m-1)*n)%MOD*n));
	b=((tetra(n-1)*m)%MOD*m)%MOD;
	ans=(((a+b)%MOD)*(comb((n*m-2),(k-2)))%MOD);
	//printf("%d %d %d",a+b,comb((n*m-2),(k-2)),ans);
	printf("%d",ans);
	return 0;
}