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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Numerics;
using System.Text;
using static System.Math;

class Program
{
    static int n, m, k;
    static long mod = (long)1e9 + 7;

    static void Main()
    {
        /* 入力の受け取り */
        string[] input = Console.ReadLine().Split();
        n = int.Parse(input[0]);
        m = int.Parse(input[1]);
        k = int.Parse(input[2]);

        /* Combinationの前計算 */
        Comb c = new Comb(n * m, mod);

        /* 答えの計算 */
        long ans = m * (m - 1) * (m + 1) / 6 % mod * n % mod * n % mod;
        ans += n * (n - 1) * (n + 1) / 6 % mod * m % mod * m % mod;
        ans %= mod;
        ans *= c.Com(n * m - 2, k - 2);
        ans %= mod;

        /* 答えの出力 */
        Console.WriteLine(ans);
    }
}

class Comb
{
    private long size;
    private long[] inv;
    private long[] kai;
    private long[] invkai;
    private long mod;
    public Comb(long size, long mod)
    {
        this.size = size;
        this.mod = mod;
        inv = new long[size + 1];
        kai = new long[size + 1];
        invkai = new long[size + 1];
        inv[1] = 1;
        for (int i = 2; i <= size; i++)
            inv[i] = mod - (mod / i) * inv[mod % i] % mod;
        kai[0] = 1;
        invkai[0] = 1;
        for (int i = 1; i <= size; i++)
        {
            kai[i] = kai[i - 1] * i % mod;
            invkai[i] = invkai[i - 1] * inv[i] % mod;
        }
    }
    public long Com(long a, long b)
    {
        if (a < b || b < 0)
            return 0;
        return (invkai[b] * invkai[a - b]) % mod * kai[a] % mod;
    }
}