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: Time Limit Exceeded)

// timeout
 
#include <stdio.h>
#include <stdlib.h>
 
int my_combination(int n, int m, int *listK){
    // nマスのうちmマスを選択する
    int i, j, k;
    if(listK[m] == 0){
        for(i = 0; i < m; i++) listK[i] = i+1;
        listK[m]++;
        return 0;
    }else{
        for(i = m-1; (i >= 0 && i < m); i--){
            listK[i]++;
            if(listK[i] == n+1 - (m-i-1)){
                continue;
            }else{
                if(i == m-1) listK[m]++;
                if(i != m-1) listK[i+1] = listK[i];
                i+=2;
            }
        }
        if(i==m) return 0;
 
    }
    
    return -1;
}
 
int compare(const void *a, const void *b) {
  return *(int *)b - *(int *)a;
}
 
int main(){
    int i, j, k, l, m, n;
    int N, M, K;
    int NM;
    int *listK;
    int *xi, *yi;
    long long int cost_sum = 0;
    long long int cost = 0;
    
    scanf("%d", &N);
    scanf("%d", &M);
    scanf("%d", &K);
    
    NM = N*M;
    
    listK = (int*)malloc(sizeof(int) * (K+1));
    
    xi = (int *)malloc(sizeof(int) * NM);
    yi = (int *)malloc(sizeof(int) * NM);
    for(i = 0; i < N; i++){
        for(j = 0; j < M; j++){
            xi[i*M+j] = j+1;
            yi[i*M+j] = i+1;
        }
    }
    
    while(my_combination(NM, K, listK) != -1){
        // for(i = 0; i < K; i++) printf("%d ", listK[i]);
        cost = 0;
        for(i = 0; i < K-1; i++){
        for(j = i+1; j < K; j++){
            cost =
            abs(xi[listK[i]-1] - xi[listK[j]-1]) +
            abs(yi[listK[i]-1] - yi[listK[j]-1]);
            cost_sum += cost;
            cost_sum = cost_sum % 1000000007;
        }
        }
        
    }
    
    printf("%lld\n", cost_sum);
 
    return 0;
}