#include <bits/stdc++.h>
using namespace std;
#define int int64_t
#define endl '\n'
#define vi vector<int>
#define vvi vector<vi>
#define F0(n, i) for(int i = 0; i < n; i++)
#define F1(n, i) for(int i = 1; i <= n; i++)
#define each(a) for(auto& e: a)
#define arr(a) { each(a) cerr << e << ' '; cerr << endl; }
const int N = 1e5, M = 1e9 + 7;
vi F(N + 1);
int exp(int x, int p) {
int ans = 1;
for(int r = x, b = 0; b < 32; b++, r = (r * r) % M) {
if((1 << b) & p) ans = (ans * r) % M;
}
return ans;
}
int imod(int x) {
return exp(x, M - 2);
}
int C(int n, int r) {
return (F[n] * imod(F[r]) % M) * imod(F[n - r]) % M;
}
void facto() {
F[0] = 1;
F1(N, i) F[i] = (F[i - 1] * i) % M;
}
void solve() {
int A, B;
cin >> A >> B;
auto dist = [&](int x1, int y1, int x2, int y2) {
return abs(x1 - x2) + abs(y1 - y2);
};
// cerr << exp(1, 5) << endl;
// cerr << C(6, 3) << endl;
int tot = C(dist(0, 0, A - 1, A - 1), A - 1);
int ways = 0, prev = 0, gap = A / 2 - B;
for(int i = 0; i < gap; i++) {
int j = A - gap;
int x = (C(dist(i, j, 0, 0), i) - prev + M) % M, y = C(dist(i, j, A - 1, A - 1), gap - 1);
cerr << i << ' ' << j << ' ' << x << ' ' << y << endl;
int curr = (x * y + M) % M;
ways = (ways + curr) % M;
cerr << i << ' ' << j << ' ' << curr << endl;
prev += x;
}
cerr << ways << endl;
ways = (ways * 2) % M;
cout << ways;
}
int32_t main() {
int t = 1;
facto();
// arr(F);
cin >> t;
while(t--) {
solve();
cout << endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGludCBpbnQ2NF90CiNkZWZpbmUgZW5kbCAnXG4nCiNkZWZpbmUgdmkgdmVjdG9yPGludD4KI2RlZmluZSB2dmkgdmVjdG9yPHZpPgojZGVmaW5lIEYwKG4sIGkpIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiNkZWZpbmUgRjEobiwgaSkgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiNkZWZpbmUgZWFjaChhKSBmb3IoYXV0byYgZTogYSkKI2RlZmluZSBhcnIoYSkgeyBlYWNoKGEpIGNlcnIgPDwgZSA8PCAnICc7IGNlcnIgPDwgZW5kbDsgfQoKY29uc3QgaW50IE4gPSAxZTUsIE0gPSAxZTkgKyA3Owp2aSBGKE4gKyAxKTsKCmludCBleHAoaW50IHgsIGludCBwKSB7CglpbnQgYW5zID0gMTsKCWZvcihpbnQgciA9IHgsIGIgPSAwOyBiIDwgMzI7IGIrKywgciA9IChyICogcikgJSBNKSB7CgkJaWYoKDEgPDwgYikgJiBwKSBhbnMgPSAoYW5zICogcikgJSBNOwoJfQoJcmV0dXJuIGFuczsKfQoKaW50IGltb2QoaW50IHgpIHsKCXJldHVybiBleHAoeCwgTSAtIDIpOwp9CgppbnQgQyhpbnQgbiwgaW50IHIpIHsKCXJldHVybiAoRltuXSAqIGltb2QoRltyXSkgJSBNKSAqIGltb2QoRltuIC0gcl0pICUgTTsKfQoKdm9pZCBmYWN0bygpIHsKCUZbMF0gPSAxOwoJRjEoTiwgaSkgRltpXSA9IChGW2kgLSAxXSAqIGkpICUgTTsKfQoKdm9pZCBzb2x2ZSgpIHsKCWludCBBLCBCOwoJY2luID4+IEEgPj4gQjsKCWF1dG8gZGlzdCA9IFsmXShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKCQlyZXR1cm4gYWJzKHgxIC0geDIpICsgYWJzKHkxIC0geTIpOwoJfTsKCS8vIGNlcnIgPDwgZXhwKDEsIDUpIDw8IGVuZGw7CgkvLyBjZXJyIDw8IEMoNiwgMykgPDwgZW5kbDsKCWludCB0b3QgPSBDKGRpc3QoMCwgMCwgQSAtIDEsIEEgLSAxKSwgQSAtIDEpOwoJaW50IHdheXMgPSAwLCBwcmV2ID0gMCwgZ2FwID0gQSAvIDIgLSBCOwoJZm9yKGludCBpID0gMDsgaSA8IGdhcDsgaSsrKSB7CgkJaW50IGogPSBBIC0gZ2FwOwoJCWludCB4ID0gKEMoZGlzdChpLCBqLCAwLCAwKSwgaSkgLSBwcmV2ICsgTSkgJSBNLCB5ID0gQyhkaXN0KGksIGosIEEgLSAxLCBBIC0gMSksIGdhcCAtIDEpOwoJCWNlcnIgPDwgaSA8PCAnICcgPDwgaiA8PCAnICcgPDwgeCA8PCAnICcgPDwgeSA8PCBlbmRsOwoJCWludCBjdXJyID0gKHggKiB5ICsgTSkgJSBNOwoJCXdheXMgPSAod2F5cyArIGN1cnIpICUgTTsKCQljZXJyIDw8IGkgPDwgJyAnIDw8IGogPDwgJyAnIDw8IGN1cnIgPDwgZW5kbDsKCQlwcmV2ICs9IHg7Cgl9CgljZXJyIDw8IHdheXMgPDwgZW5kbDsKCXdheXMgPSAod2F5cyAqIDIpICUgTTsKCWNvdXQgPDwgd2F5czsKfQoKaW50MzJfdCBtYWluKCkgewoJaW50IHQgPSAxOwoJZmFjdG8oKTsKCS8vIGFycihGKTsKCWNpbiA+PiB0OwoJd2hpbGUodC0tKSB7CgkJc29sdmUoKTsKCQljb3V0IDw8IGVuZGw7Cgl9Cn0=