#include <cstdio>
#include <cstring>
using namespace std;
const int MOD = 100007;
const int MAXK = 500;
int C[MAXK + 10][MAXK + 10];
int main(int argc, char const *argv[])
{
memset(C, 0, sizeof(C));
C[0][0] = 1;
for (int i = 0; i <= MAXK; i++)
{
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; j++)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
}
int T;
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++)
{
int n, m, k, sum = 0;
scanf("%d%d%d", &n, &m, &k);
for (int S = 0; S < 16; S++)
{
int b = 0, r = n, c = m;
if (S & 1) {r--; b++;}
if (S & 2) {r--; b++;}
if (S & 4) {c--; b++;}
if (S & 8) {c--; b++;}
if (b & 1) sum = (sum + MOD - C[r * c][k]) % MOD;
else sum = (sum + C[r * c][k]) % MOD;
}
printf("Case %d: %d\n", kase, sum);
}
return 0;
}
用容斥原理算出几条边的情况 用全集减去它门在减去都不在的情况。那么就是答案了。
还有就是将C的组合数打表。用两重循环 与排列组合的性质可以在o(n^2)内打出一定范围内的组合数表。