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>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define mod 1000000007

long int extGCD(long int a, long int b, long int *x, long int *y) {
    if (b == 0) {
        *x = 1;
        *y = 0;
        return a;
    }
    long int d = extGCD(b, a%b, y, x);
    *y -= a / b * (*x);
    return d;
}

long int comb_mod(long int n, long int r) {
    long int deno = 1;
    long int mole = 1;
    long int r_change = (r <= n / 2) ? r : n - r;
    for (int i=1; i<=r_change; i++) {
        mole = mole * i % mod;
    }
    for (int i=n-r_change+1; i<=n; i++) {
        deno = deno * i % mod;
    }
    long int x = 0, mole_inv = 0;
    extGCD(mod, mole%mod, &x, &mole_inv);
    mole_inv = mole_inv % mod;
    return (deno * mole_inv) % mod;
}

int main() {
    long int h = 0, w = 0, koma = 0;
    scanf("%ld %ld %ld", &h, &w, &koma);
    long int sum_x = 0;
    long int com = comb_mod(h*w-2, koma-2);
    if (com < 0) {
        com += mod;
    }
    for (int i=1; i<w; i++) {
        long int num = (h * h) % mod;
        long int hoge = (w - i) % mod;
        sum_x += (((((com * num) % mod) * hoge) % mod) * i) % mod;
        sum_x = sum_x % mod;
    }
    long int sum_y = 0;
    for (int i=1; i<h; i++) {
        long int num = (w * w) % mod;
        long int hoge = (h - i) % mod;
        sum_y += (((((com * num) % mod) * hoge) % mod) * i) % mod;
        sum_y = sum_y % mod;
    }
    long int ans = sum_x + sum_y;
    printf("%ld\n", ans%mod);
    return 0;
}