#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int md = 1e9+7;
const int N = 100005;
int fact[N],ifact[N];
int power(int a,int b)
{
int ans = 1;
while(b)
{
if(b&1)
ans=((ll)ans*a)%md;
a = ((ll)a*a)%md;
b>>=1;
}
return ans;
}
int nCr(int n,int k)
{
if(n<k || k<0)
return 0;
int ans = fact[n];
ans = ((ll)ans*ifact[n-k])%md;
ans = ((ll)ans*ifact[k])%md;
return ans;
}
signed main()
{
//clock_t clk = clock();
fact[0] = 1;
ifact[0] = 1;
for(int i=1;i<N;i++)
{
fact[i] = ((ll)fact[i-1]*i)%md;
}
ifact[N-1] = power(fact[N-1],md-2);
for(int i = N-2;i>=0;i--)
ifact[i] = ((ll)ifact[i+1]*(i+1))%md;
int t;
scanf("%d",&t);
assert(t<=20 && t>=1);
while(t--)
{
int n,k;
scanf("%d %d",&n,&k);
assert(n>=1 && n<=100000);
assert(k>=0 && k<=100000);
n>>=1;
int ans = 0;
for(int i=0;i<=min(n/2,k);i++)
{
int val = (nCr(n,i)-nCr(n,i-1))%md;
ans = (ans + ((ll)val*val)%md)%md;
}
ans = ((ll)ans*power(nCr(2*n,n),md-2))%md;
ans = ((ll)ans*(n+1))%md;
printf("%d\n",ans);
}
//cout<<(float)(clock()-clk)/CLOCKS_PER_SEC;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgaW50IGxsOwpjb25zdCBpbnQgbWQgPSAxZTkrNzsKY29uc3QgaW50IE4gPSAgMTAwMDA1OwppbnQgZmFjdFtOXSxpZmFjdFtOXTsKCmludCBwb3dlcihpbnQgYSxpbnQgYikKewoJaW50IGFucyA9IDE7Cgl3aGlsZShiKQoJewoJCWlmKGImMSkKCQkJYW5zPSgobGwpYW5zKmEpJW1kOwoJCWEgPSAoKGxsKWEqYSklbWQ7CgkJYj4+PTE7Cgl9CglyZXR1cm4gYW5zOwp9CmludCBuQ3IoaW50IG4saW50IGspCnsKCWlmKG48ayB8fCBrPDApCgkJcmV0dXJuIDA7CglpbnQgYW5zID0gZmFjdFtuXTsKCWFucyA9ICgobGwpYW5zKmlmYWN0W24ta10pJW1kOwoJYW5zID0gKChsbClhbnMqaWZhY3Rba10pJW1kOwoJcmV0dXJuIGFuczsKfQpzaWduZWQgbWFpbigpCnsKCS8vY2xvY2tfdCBjbGsgPSBjbG9jaygpOwoJZmFjdFswXSA9IDE7CglpZmFjdFswXSA9IDE7Cglmb3IoaW50IGk9MTtpPE47aSsrKQoJewoJCWZhY3RbaV0gPSAoKGxsKWZhY3RbaS0xXSppKSVtZDsKCX0KCWlmYWN0W04tMV0gPSBwb3dlcihmYWN0W04tMV0sbWQtMik7Cglmb3IoaW50IGkgPSBOLTI7aT49MDtpLS0pCgkJaWZhY3RbaV0gPSAoKGxsKWlmYWN0W2krMV0qKGkrMSkpJW1kOwoJaW50IHQ7CglzY2FuZigiJWQiLCZ0KTsKCWFzc2VydCh0PD0yMCAmJiB0Pj0xKTsKCXdoaWxlKHQtLSkKCXsKCWludCBuLGs7CglzY2FuZigiJWQgJWQiLCZuLCZrKTsKCWFzc2VydChuPj0xICYmIG48PTEwMDAwMCk7Cglhc3NlcnQoaz49MCAmJiBrPD0xMDAwMDApOwoJbj4+PTE7CglpbnQgYW5zID0gMDsKCWZvcihpbnQgaT0wO2k8PW1pbihuLzIsayk7aSsrKQoJewoJCWludCB2YWwgPSAobkNyKG4saSktbkNyKG4saS0xKSklbWQ7CgkJYW5zID0gKGFucyArICgobGwpdmFsKnZhbCklbWQpJW1kOwoJfQoJYW5zID0gKChsbClhbnMqcG93ZXIobkNyKDIqbixuKSxtZC0yKSklbWQ7CglhbnMgPSAoKGxsKWFucyoobisxKSklbWQ7CglwcmludGYoIiVkXG4iLGFucyk7Cgl9CgkvL2NvdXQ8PChmbG9hdCkoY2xvY2soKS1jbGspL0NMT0NLU19QRVJfU0VDOwoJcmV0dXJuIDA7Cn0=