显示原始代码
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define ud unsigned int
#define ll long long
#define ull unsigned long long
#define MAX_INF 0x3f
#define MAX_INF_VAL 0x3f3f3f3f
#define MAX_INF_VAL_LL 0x3f3f3f3f3f3f3f3f
#define eps 1e-9
#define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb))
#define G(x) ((x) < tb ? (x)*3 + 1 : ((x)-tb) * 3 + 2)
using namespace std;
template <typename T>
void read(T &x) {
x = 0;
char ch = getchar();
ll f = 1;
while (!isdigit(ch)) {
if (ch == '-')
f *= -1;
ch = getchar();
}
while (isdigit(ch)) {
x = x * 10 + ch - 48;
ch = getchar();
}
x *= f;
}
struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
x += 0x9e3779b97f4a7c15;
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
return x ^ (x >> 31);
}
size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
};
const ll p = 1e9 + 7;
ll f[1010][1010][2];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t;
int n, m;
cin >> t;
memset(f, 0, sizeof(f));
f[1][0][0] = 1;
for (int i = 1; i < 1000; ++i) {
for (int j = 0; j < i; ++j) {
for (int k = 0; k < 2; ++k) {
ll tmp = f[i][j][k];
if (tmp == 0)
continue;
ll n0, n1, n2, n3 = 0;
if (k == 0) {
n0 = tmp * j;
n1 = tmp * 2;
n2 = tmp * (i - 1 - j);
} else {
n0 = tmp * (j - 1);
n1 = tmp;
n2 = tmp * (i - j);
n3 = tmp;
}
if (n0)
f[i + 1][j - 1][0] = (f[i + 1][j - 1][0] + n0) % p;
f[i + 1][j + 1][1] = (f[i + 1][j + 1][1] + n1) % p;
f[i + 1][j][0] = (f[i + 1][j][0] + n2) % p;
f[i + 1][j][1] = (f[i + 1][j][1] + n3) % p;
}
}
}
while (t--) {
cin >> n >> m;
cout << (f[n][m][0] + f[n][m][1]) % p << '\n';
}
return 0;
}