版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/81878357
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 81;
int T, n, m, mod;
ll dp[2][maxn][maxn];
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &m, &mod);
int idx = 0;
for (int i = 0; i <= n; i++) for (int j = 0; j <= m; j++) dp[idx][i][j] = 0;
dp[idx][1][1] = n*m;
for (int k = 2; k <= n*m; k++) {
idx ^= 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[idx][i][j] = 0;
if (i > 1 && dp[idx^1][i-1][j]) {
dp[idx][i][j] += dp[idx^1][i-1][j]*(n-i+1)*j;
}
if (j > 1 && dp[idx^1][i][j-1]) {
dp[idx][i][j] += dp[idx^1][i][j-1]*(m-j+1)*i;
}
if (dp[idx^1][i][j] && i*j-k+1 > 0) {
dp[idx][i][j] += dp[idx^1][i][j]*(i*j-k+1);
}
dp[idx][i][j] %= mod;
}
}
}
printf("%lld\n", dp[idx][n][m]);
}
return 0;
}
/*
2
3 3 100
5 5 2333
*/