显示原始代码
#include <cstdio>
#include <algorithm>
using namespace std;
int n, k, dp[1005][1005][2], T;
const int mod = 1e9 + 7;
int M(int x) { return x >= mod ? x - mod : x; }
int main() {
dp[1][0][1] = 1;
dp[2][1][0] = 2;
for (int i = 2; i <= 1000; i++) {
for (int j = 0; j < i; j++) {
if (dp[i][j][0]) {
dp[i + 1][j][0] = M(dp[i + 1][j][0] + dp[i][j][0]);
if (j)
dp[i + 1][j - 1][1] = (1ll * dp[i + 1][j - 1][1] + 1ll * (j - 1) * dp[i][j][0]) % mod;
dp[i + 1][j][1] = (1ll * dp[i + 1][j][1] + 1ll * (i - j) * dp[i][j][0]) % mod;
dp[i + 1][j + 1][0] = M(dp[i + 1][j + 1][0] + dp[i][j][0]);
}
if (dp[i][j][1]) {
if (j)
dp[i + 1][j - 1][1] = (1ll * dp[i + 1][j - 1][1] + 1ll * j * dp[i][j][1]) % mod;
dp[i + 1][j][1] = (1ll * dp[i + 1][j][1] + 1ll * (i - j - 1) * dp[i][j][1]) % mod;
dp[i + 1][j + 1][0] = (1ll * dp[i + 1][j + 1][0] + 2ll * dp[i][j][1]) % mod;
}
}
}
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &k);
printf("%d\n", M(dp[n][k][0] + dp[n][k][1]));
}
return 0;
}