|
|
|
@ -1,59 +1,50 @@
|
|
|
|
|
#include <set>
|
|
|
|
|
#include <map>
|
|
|
|
|
#include <cmath>
|
|
|
|
|
#include <stack>
|
|
|
|
|
#include <queue>
|
|
|
|
|
#include <vector>
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <cstdio>
|
|
|
|
|
#include <cstring>
|
|
|
|
|
#include <sstream>
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#define clr(str, x) memset(str, x, sizeof(str))
|
|
|
|
|
#define FRER() freopen("in.txt", "r", stdin);
|
|
|
|
|
#define FREW() freopen("out.txt", "w", stdout);
|
|
|
|
|
#define MAX_INF 0x7fffffff
|
|
|
|
|
#define INF 0x3f3f3f3f
|
|
|
|
|
#define maxn
|
|
|
|
|
|
|
|
|
|
typedef long long int ll;
|
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
const int mod = 1000007;
|
|
|
|
|
int C[405][405];
|
|
|
|
|
int n, m, k, ans = 0;
|
|
|
|
|
void init() {
|
|
|
|
|
for (int i = 1; i <= 400; i++) {
|
|
|
|
|
const int N = 410;
|
|
|
|
|
int C[N][N];
|
|
|
|
|
int n, m, k, ans;
|
|
|
|
|
/*
|
|
|
|
|
Sample Input
|
|
|
|
|
2
|
|
|
|
|
2 2 1
|
|
|
|
|
2 3 2
|
|
|
|
|
Sample Output
|
|
|
|
|
Case 1: 0
|
|
|
|
|
Case 2: 2
|
|
|
|
|
*/
|
|
|
|
|
int main() {
|
|
|
|
|
#ifndef ONLINE_JUDGE
|
|
|
|
|
freopen("UVA11806.in", "r", stdin);
|
|
|
|
|
#endif
|
|
|
|
|
// 预处理出组合数结果数组
|
|
|
|
|
for (int i = 1; i < N; i++) {
|
|
|
|
|
C[i][0] = C[i][i] = 1;
|
|
|
|
|
for (int j = 1; j < i; j++)
|
|
|
|
|
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
int main() {
|
|
|
|
|
// FRER()
|
|
|
|
|
// FREW()
|
|
|
|
|
init();
|
|
|
|
|
int T, kase = 1;
|
|
|
|
|
int s1, s2, s3, s4, s5;
|
|
|
|
|
scanf("%d", &T);
|
|
|
|
|
|
|
|
|
|
int T, cas = 1;
|
|
|
|
|
int S, s1, s2, s3, s4;
|
|
|
|
|
cin >> T;
|
|
|
|
|
while (T--) {
|
|
|
|
|
ans = 0;
|
|
|
|
|
scanf("%d%d%d", &n, &m, &k);
|
|
|
|
|
if (k == 0) {
|
|
|
|
|
printf("Case %d: 0\n", kase++);
|
|
|
|
|
ans = 0; // 多组测试数据,每次注意清零
|
|
|
|
|
cin >> n >> m >> k; // n行,m列,k个人
|
|
|
|
|
if (k == 0) { // 一定要注意边界情况,比如0个人
|
|
|
|
|
printf("Case %d: 0\n", cas++);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s1 = C[n * m][k];
|
|
|
|
|
s2 = 2 * (C[n * (m - 1)][k] + C[(n - 1) * m][k]) % mod;
|
|
|
|
|
s3 = (C[(n - 2) * m][k] + 4 * C[n * m - n - m + 1][k] + C[n * (m - 2)][k]) % mod;
|
|
|
|
|
s4 = 2 * (C[(n - 2) * (m - 1)][k] + C[(n - 1) * (m - 2)][k]) % mod;
|
|
|
|
|
s5 = C[(n - 2) * (m - 2)][k] % mod;
|
|
|
|
|
S = C[n * m][k]; // n*m个格子中找出k个格子站人,就是所有方案数
|
|
|
|
|
s1 = 2 * (C[n * (m - 1)][k] + C[(n - 1) * m][k]) % mod;
|
|
|
|
|
s2 = (C[(n - 2) * m][k] + 4 * C[n * m - n - m + 1][k] + C[n * (m - 2)][k]) % mod;
|
|
|
|
|
s3 = 2 * (C[(n - 2) * (m - 1)][k] + C[(n - 1) * (m - 2)][k]) % mod;
|
|
|
|
|
s4 = C[(n - 2) * (m - 2)][k] % mod;
|
|
|
|
|
|
|
|
|
|
ans = s1 - s2 + s3 - s4 + s5;
|
|
|
|
|
ans = (ans + 10 * mod) % mod; // 防止取余后出现负数
|
|
|
|
|
printf("Case %d: %d\n", kase++, ans);
|
|
|
|
|
ans = (S - s1 + s2 - s3 + s4) % mod; // 容斥原理
|
|
|
|
|
ans = (ans + mod) % mod; // 防止取余后出现负数
|
|
|
|
|
printf("Case %d: %d\n", cas++, ans); // 输出答案
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|