#include using namespace std; typedef long long ll; typedef double db; typedef pair pii; #define fir first #define sec second #define rep(i,a,b) for (int i = (a) ; i <= (b) ; ++ i) #define rrp(i,a,b) for (int i = (a) ; i >= (b) ; -- i) #define gc() getchar() template inline void read(tp& x) { x = 0; char tmp; bool key = 0; for (tmp = gc() ; !isdigit(tmp) ; tmp = gc()) key = (tmp == '-'); for ( ; isdigit(tmp) ; tmp = gc()) x = (x << 3) + (x << 1) + (tmp ^ '0'); if (key) x = -x; } template inline void ckmn(tp& x,tp y) { x = x < y ? x : y; } template inline void ckmx(tp& x,tp y) { x = x < y ? y : x; } const int MOD = (int)(1e9 + 7); inline void Add(int& x,int y) { x = x + y >= MOD ? x + y - MOD : x + y; } inline void Sub(int& x,int y) { x = x - y < 0 ? x - y + MOD : x - y; } const int N = 1010; int dp[2][N][15], isok[2][N][15]; int n, m; void solve() { read(n), read(m); memset(dp, 0, sizeof dp); memset(isok, 0, sizeof isok); dp[0][0][0] = 1; isok[0][0][0] = 1; int p = 0; rep (i, 2, n) { p ^= 1; memset(dp[p], 0, sizeof dp[p]); memset(isok[p], 0, sizeof isok[p]); rep (j, 0, i-1) { rep (k, 0, 10) { Add(dp[p][j][0], dp[p^1][j][k]); isok[p][j][0] |= isok[p^1][j][k]; if (k < 10) { Add(dp[p][j+1][k+1], 1ll * (i-1) * dp[p^1][j][k] % MOD); isok[p][j+1][k+1] |= isok[p^1][j][k]; } } } } if (!isok[p][m][0]) puts("-1"); else printf("%d\n", dp[p][m][0]); } int main() { int T; read(T); while (T --) solve(); return 0; }