#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
ll gcdExtended(ll a, ll b, ll *x, ll *y);
// Function to find modulo inverse of b. It returns
// -1 when inverse doesn't
ll modInverse(ll b, ll m)
{
ll x, y; // used in extended GCD algorithm
ll g = gcdExtended(b, m, &x, &y);
// Return -1 if b and m are not co-prime
if (g != 1)
return -1;
// m is added to handle negative x
return (x % m + m) % m;
}
// Function to compute a/b under modulo m
void modDivide(ll a, ll b, ll m)
{
a = a % m;
ll inv = modInverse(b, m);
if (inv == -1)
cout << "Division not defined";
else
cout << (inv * a) % m;
}
// C function for extended Euclidean Algorithm (used to
// find modular inverse.
ll gcdExtended(ll a, ll b, ll *x, ll *y)
{
// Base Case
if (a == 0)
{
*x = 0, *y = 1;
return b;
}
ll x1, y1; // To store results of recursive call
ll gcd = gcdExtended(b % a, a, &x1, &y1);
// Update x and y using results of recursive
// call
*x = y1 - (b / a) * x1;
*y = x1;
return gcd;
}
int main()
{
cin.tie(NULL);
cout.tie(NULL);
ll fac[1000000 + 1];
fac[0] = 1;
for (ll i = 1; i <= 1000000; i++)
{
fac[i] = (fac[i - 1] * i) % mod;
}
ll t;
cin >> t;
while (t--)
{
ll a, b;
cin >> a >> b;
modDivide(fac[a], (fac[b] * fac[a - b]) % mod, mod);
cout << endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDcKCmxsIGdjZEV4dGVuZGVkKGxsIGEsIGxsIGIsIGxsICp4LCBsbCAqeSk7CgovLyBGdW5jdGlvbiB0byBmaW5kIG1vZHVsbyBpbnZlcnNlIG9mIGIuIEl0IHJldHVybnMKLy8gLTEgd2hlbiBpbnZlcnNlIGRvZXNuJ3QKbGwgbW9kSW52ZXJzZShsbCBiLCBsbCBtKQp7CiAgICBsbCB4LCB5OyAvLyB1c2VkIGluIGV4dGVuZGVkIEdDRCBhbGdvcml0aG0KICAgIGxsIGcgPSBnY2RFeHRlbmRlZChiLCBtLCAmeCwgJnkpOwoKICAgIC8vIFJldHVybiAtMSBpZiBiIGFuZCBtIGFyZSBub3QgY28tcHJpbWUKICAgIGlmIChnICE9IDEpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgIC8vIG0gaXMgYWRkZWQgdG8gaGFuZGxlIG5lZ2F0aXZlIHgKICAgIHJldHVybiAoeCAlIG0gKyBtKSAlIG07Cn0KCi8vIEZ1bmN0aW9uIHRvIGNvbXB1dGUgYS9iIHVuZGVyIG1vZHVsbyBtCnZvaWQgbW9kRGl2aWRlKGxsIGEsIGxsIGIsIGxsIG0pCnsKICAgIGEgPSBhICUgbTsKICAgIGxsIGludiA9IG1vZEludmVyc2UoYiwgbSk7CiAgICBpZiAoaW52ID09IC0xKQogICAgICAgIGNvdXQgPDwgIkRpdmlzaW9uIG5vdCBkZWZpbmVkIjsKICAgIGVsc2UKICAgICAgICBjb3V0IDw8IChpbnYgKiBhKSAlIG07Cn0KCi8vIEMgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIEV1Y2xpZGVhbiBBbGdvcml0aG0gKHVzZWQgdG8KLy8gZmluZCBtb2R1bGFyIGludmVyc2UuCmxsIGdjZEV4dGVuZGVkKGxsIGEsIGxsIGIsIGxsICp4LCBsbCAqeSkKewogICAgLy8gQmFzZSBDYXNlCiAgICBpZiAoYSA9PSAwKQogICAgewogICAgICAgICp4ID0gMCwgKnkgPSAxOwogICAgICAgIHJldHVybiBiOwogICAgfQoKICAgIGxsIHgxLCB5MTsgLy8gVG8gc3RvcmUgcmVzdWx0cyBvZiByZWN1cnNpdmUgY2FsbAogICAgbGwgZ2NkID0gZ2NkRXh0ZW5kZWQoYiAlIGEsIGEsICZ4MSwgJnkxKTsKCiAgICAvLyBVcGRhdGUgeCBhbmQgeSB1c2luZyByZXN1bHRzIG9mIHJlY3Vyc2l2ZQogICAgLy8gY2FsbAogICAgKnggPSB5MSAtIChiIC8gYSkgKiB4MTsKICAgICp5ID0geDE7CgogICAgcmV0dXJuIGdjZDsKfQoKaW50IG1haW4oKQp7CgogICAgY2luLnRpZShOVUxMKTsKICAgIGNvdXQudGllKE5VTEwpOwoKICAgIGxsIGZhY1sxMDAwMDAwICsgMV07CiAgICBmYWNbMF0gPSAxOwogICAgZm9yIChsbCBpID0gMTsgaSA8PSAxMDAwMDAwOyBpKyspCiAgICB7CiAgICAgICAgZmFjW2ldID0gKGZhY1tpIC0gMV0gKiBpKSAlIG1vZDsKICAgIH0KICAgIGxsIHQ7CiAgICBjaW4gPj4gdDsKCiAgICB3aGlsZSAodC0tKQogICAgewogICAgICAgIGxsIGEsIGI7CiAgICAgICAgY2luID4+IGEgPj4gYjsKCiAgICAgICAgbW9kRGl2aWRlKGZhY1thXSwgKGZhY1tiXSAqIGZhY1thIC0gYl0pICUgbW9kLCBtb2QpOwoKICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICB9Cn0=