#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const ll p = 1000000007;
const ll biggest = 500000;
ll factorial[biggest], inverse[biggest];
ll fast_pow_mod(ll base, ll exp, ll p) {
if (base == 0) return 0;
ll ans = 1;
while (exp > 0) {
if(exp & 1) ans = (ans * base) % p;
base = (base * base) % p;
exp >>= 1;
}
return ans;
}
//计算m * (m - 1) * ... *(m - n + 1), 这种方式单次是o(n),总时间o(n * t)超时
//ll factorial(ll m, ll n, ll p) {
// ll result = 1;
// while (n-- > 0) {
// result = (result * m) % p;
// m--;
// }
// return result;
//}
//比较容易踩坑的点c(m,n)中, m >= 0, n >= 0且c(0,0) = 1
//对于阶乘而言0! = 1,所以即使n = 0 / n = m两种情况下依旧可以求出n!和(n - m)!的逆元
int main() {
//预处理
factorial[0] = 1;
factorial[1] = 1;
for (int i = 2;i <= biggest; i++) {
factorial[i] = factorial[i - 1] * i % p;
}
for (int i = 0; i <= biggest; i ++) {
inverse[i] = fast_pow_mod(factorial[i], p - 2, p);
}
ll m, n;
int t;
cin >> t;
while (t-- > 0) {
cin >> n >> m;
//C m n
// ll a = factorial(m, n, p);
// ll b = factorial(n, n, p);
// ll inverse = fast_pow_mod(b, p - 2, p);
ll ans;
ans = ((factorial[m] * inverse[n]) % p) * inverse[m - n] % p;
// ans = ((factorial[m] * inverse[n]) % p) * inverse[m - n] % p;
cout << ans << endl;
}
}