枚举力矩和、拿走橡皮的个数,然后就变成整数拆分问题了。
/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10005, maxk = 12;
int n, k, p, dp[maxn * maxk][maxk];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
int main() {
for(int T = iread(); T; T--) {
n = iread(); k = iread(); p = iread();
if(k == 1) {
printf("1\n");
continue;
}
int w = n * (k - 1);
dp[0][0] = 1;
for(int i = 1; i <= w; i++) for(int j = 1; j < k; j++) {
if(i >= j) dp[i][j] = (dp[i - j][j] + dp[i - j][j - 1]) % p;
else dp[i][j] = 0;
if(i > n) dp[i][j] = (dp[i][j] - dp[i - (n + 1)][j - 1] + p) % p;
}
int ans = 0;
for(int i = 1; i <= w; i++) for(int j = 1; j < k; j++)
ans = (ans + dp[i][j] * dp[i][k - j] + dp[i][j] * dp[i][k - j - 1]) % p;
printf("%d\n", ans);
}
return 0;
}