//题意:将2*n的长方形划分为k块,有多少种方法。最小单位为1*1的小矩形,且每块都不同。
//解法:递推,状态转移种类比较多,需要考虑全面。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const long long M=100000007;
long long n, k;
long long dp[1005][2005][2];
int main(){
//freopen("1.txt", "r", stdin);
long long T, i, j;
scanf("%lld", &T);
dp[1][1][0]=1;dp[1][1][1]=0;
dp[1][2][0]=0;dp[1][2][1]=1;
for(i=2; i<=1000; i++){
dp[i][1][0]=1;
dp[i][1][1]=0;
dp[i][0][0]=0;
dp[i][0][1]=0;
for(j=2; j<=2*i; j++){
dp[i][j][0]=(2*dp[i-1][j][1]+dp[i-1][j][0]+dp[i-1][j-1][0]+dp[i-1][j-1][1])%M;
dp[i][j][1]=(dp[i-1][j][1]+dp[i-1][j-2][0]+dp[i-1][j-2][1]+2*dp[i-1][j-1][1]+2*dp[i-1][j-1][0])%M;
}
}
while(T--){
scanf("%lld%lld", &n, &k);
printf("%I64d\n", (dp[n][k][0]+dp[n][k][1])%M);
}
return 0;
}