You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.4 KiB

2 years ago
#include <bits/stdc++.h>
2 years ago
using namespace std;
2 years ago
2 years ago
const int mod = 1000007;
2 years ago
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++) {
2 years ago
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;
}
2 years ago
int T, cas = 1;
int S, s1, s2, s3, s4;
cin >> T;
2 years ago
while (T--) {
2 years ago
ans = 0; // 多组测试数据,每次注意清零
cin >> n >> m >> k; // n行,m列,k个人
if (k == 0) { // 一定要注意边界情况比如0个人
printf("Case %d: 0\n", cas++);
2 years ago
continue;
}
2 years ago
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;
2 years ago
2 years ago
ans = (S - s1 + s2 - s3 + s4) % mod; // 容斥原理
ans = (ans + mod) % mod; // 防止取余后出现负数
printf("Case %d: %d\n", cas++, ans); // 输出答案
2 years ago
}
return 0;
}