#include #include using namespace std; using namespace atcoder; using ll = long long; constexpr ll mod = 1e9 + 7; constexpr ll INF = (1LL << 62) - (1LL << 31) - 1; #define REP(i, init, n) for(int i = (int)(init); i < (int)(n); i++) #define RREP(i, init, n) for(int i = (int)(init); i >= (int)(n); i--) #define All(A) A.begin(), A.end() #define rAll(A) A.rbegin(), A.rend() #define vi vector #define vl vector #define vvi vector> #define vvl vector> #define pint pair #define plong pair int T; vector fact, inv_fact; modint nCk(int n, int k) { return fact[n] * inv_fact[k] * inv_fact[n - k]; } void solve() { fact.resize(300001); inv_fact.resize(300001); fact[0] = 1; REP(i, 1, 300001) fact[i] = fact[i - 1] * i; inv_fact[300000] = fact[300000].inv(); RREP(i, 300000, 1) inv_fact[i - 1] = inv_fact[i] * i; REP(_, 0, T) { int N, A; cin >> N >> A; vi divs = {}; int d = 1; while(d * d <= A) { if(A % d == 0) { divs.push_back(d); if(d * d != A) divs.push_back(A / d); } d++; } modint ans = 0; for(int d: divs) { int s = A / d; if(s > N - 1) continue; if((N - 1) % 2 != (s % 2)) continue; modint tmp = nCk(N - 1, (N - 1 - s) / 2); if(N - 1 - s >= 2) { tmp -= nCk(N - 1, (N - 1 - s) / 2 - 1); } ans += tmp; } cout << ans.val() << endl; } } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cin >> T; solve(); }