intmain(){ // 预处理阶乘模数 for (int m = 1; m <= M; ++m) { jl[m][0] = 1; for (int i = 1; i <= N; ++i) { jl[m][i] = (longlong) jl[m][i - 1] * m % mod; } }
dp[1][0][0] = 1; for (int n = 1; n <= N; ++n) { dp[1][n][0] = 1; }
int n_; for (int m = 2; m <= M; ++m) { // 初始化dpl和dpr数组 for (int n = 0; n <= N; ++n) { for (int c = 0; c <= n; ++c) { for (int l = (n - c) % 2; c + l <= n; l += 2) { dpl[n][c][l] = 0; } for (int r = (n - c) % 2; c + r <= n; r += 2) { dpr[n][c][r] = 0; } } }
// 更新dpl和dpr数组 for (int n = 0; n <= N; ++n) { for (int k = 0; k <= n / 2; ++k) { if (!dp[m - 1][n][k]) { continue; } dpl[n][0][n - k * 2] = (dpl[n][0][n - k * 2] + dp[m - 1][n][k]) % mod; dpr[n][0][n] = (dpr[n][0][n] + dp[m - 1][n][k]) % mod; } }
// 计算新的答案 for (int n = 0; n <= N; ++n) { for (int c = 0; c <= n; ++c) { for (int l = (n - c) % 2; c + l <= n; l += 2) { if (!dpl[n][c][l]) { continue; } int k = (n - (c + (l == 0 ? 0 : (l - 1) % 2 + 1))) / 2; dp[m][n][k] = (dp[m][n][k] + dpl[n][c][l]) % mod; } for (int n1 = 0; (n_ = n + 1 + n1) <= N; ++n1) { for (int l = (n - c) % 2; c + l <= n; l += 2) { if (!dpl[n][c][l]) { continue; } if (l <= n1) { dpr[n_][c + 1][n1 - l] = (dpr[n_][c + 1][n1 - l] + (longlong) dpl[n][c][l] * jl[m - 1][n1]) % mod; } else { int c_, r_; if (!n1 && !(l % 2)) { c_ = c + 3, r_ = 0; } else { c_ = c + 2, r_ = n1 - (l % 2 == 0 ? 1 : 0); } dpl[n_][c_][r_ % 2] = (dpl[n_][c_][r_ % 2] + (longlong) dpl[n][c][l] * jl[m - 1][n1]) % mod; dpr[n_][c_][r_] = (dpr[n_][c_][r_] + (longlong) dpl[n][c][l] * jl[m - 1][n1]) % mod; } } int r; for (r = (n - c) % 2; c + r <= n && r <= n1; r += 2) { if (!dpr[n][c][r]) { continue; } for (int k1 = 0; k1 * 2 <= n1; ++k1) { int tp_max = max((n1 - r) - k1 * 2, (n1 - r) % 2); dpl[n_][c + 1][tp_max] = (dpl[n_][c + 1][tp_max] + (longlong) dpr[n][c][r] * dp[m - 1][n1][k1]) % mod; } } int x = 0; for ( ; c + r <= n; r += 2) { x = ((longlong) x + dpr[n][c][r] - dpl[n][c][r] + mod) % mod; } int tp = (n1 + n - c) % 2; dpl[n_][c + 1][tp] = (dpl[n_][c + 1][tp % 2] + (longlong) x * jl[m - 1][n1]) % mod; } } } }
scanf("%d", &T); for (int i = 1; i <= T; ++i) { int n, m, k; scanf("%d%d", &n, &m); for (k = 0; k * 2 < n; ++k) { printf("%d ", dp[m][n][k]); } printf("\n"); } return0; }