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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mo = 1e9 + 7;
#define sum(x) (((x)*(x+1)>>1)%mo)
const int MAXM = 2e5 + 10;
inline ll fpm(ll a, ll b = mo - 2)
{
    ll ans = 1;
    while(b)
    {
        if(b & 1) ans = ans * a % mo;
        a = a * a % mo;
        b >>= 1;
    }
    return ans;
}
ll fact[MAXM], invfac[MAXM];
template <class T>
inline void _read(T &x)
{
    x = 0;
    char t = getchar();
    while (!isdigit(t) && t != '-') t = getchar();
    if (t == '-')
    {
        _read(x);
        x *= -1;
        return ;
    }
    while (isdigit(t))
    {
        x = x * 10 + t - '0';
        t = getchar();
    }
}
inline void pre()
{
    fact[0] = invfac[0] =1;
    fact[1] = invfac[1] = 1;
    for(int i = 2; i < MAXM; ++i) fact[i] = 1ll * i * fact[i - 1] % mo, invfac[i] = fpm(fact[i]);
}
inline ll C(ll n, ll r)
{
    if(n < r || r < 0 || n < 0) return 0;
    return fact[n] * invfac[r] % mo * invfac[n - r] % mo;
}
ll n, m, k;
int main()
{
	pre();
	_read(n), _read(m), _read(k);
	ll ans = 0;
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < m; ++j)
		{
			ans = (ans + ((sum(i) + sum(n - i - 1)) % mo) * m) % mo;
			ans = (ans + ((sum(j) + sum(m - j - 1)) % mo) * n) % mo;
		}
	}
	ans = ans * C(n * m - 2, k - 2) % mo * fpm(2) % mo;
	printf("%lld\n", ans);
	return 0;
}