#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
const int MOD = 1e9 + 7;
struct Primes {
  vector<int> lp, pr;
  int n;
  Primes(int n) : n(n), lp(n + 1) {
    for (int i = 2; 1ll * i * i <= n; i == 2 ? i += 1 : i += 2) {
      if (lp[i] == 0) {
        for (long long j = 1ll * i * i; j <= n; j += i) {
          lp[j] = i;
        }
      }
    }
  }
} P(N);
struct Sums {
  vector<int> s;
  Sums(int n) : s(n + 1) {}
  void Set(int i, int x) { s[1 + i] = x; }
  void Compute() {
    for (int(i) = (0); (i) < ((int)s.size() - 1); (i)++)
      s[1 + i] = ((s[1 + i] + s[1 + i - 1]) % MOD);
  }
  int Get(int l, int r) {
    if (l > r) return 0;
    return ((s[1 + r] - s[1 + l - 1]) % MOD);
  }
  void Clear() { s.assign(s.size(), 0); }
};
const int MAXX = 20;
int F[N + 1][MAXX + 1];
int main(int argc, char* argv[]) {
  ios::sync_with_stdio(0);
  Sums prv(MAXX + 1), nxt(MAXX + 1);
  for (int(r) = (0); (r) < (N + 1); (r)++) {
    for (int(i) = (0); (i) < (MAXX + 1); (i)++) {
      if (i == 0) {
        F[r][i] = 1;
      } else if (r == 0) {
        F[r][i] = 2;
      } else {
        F[r][i] = ((F[r][i - 1] + F[r - 1][i]) % MOD);
      }
    }
  }
  int q;
  scanf("%d", &q);
  for (int(Q) = (0); (Q) < (q); (Q)++) {
    int n, r;
    scanf("%d%d", &r, &n);
    int ans = 1;
    for (; n != 1;) {
      int c;
      int p = P.lp[n];
      if (p == 0) {
        c = 1;
        n = 1;
      } else {
        c = 0;
        for (; n % p == 0; n /= p, c++)
          ;
      }
      ans = ((ans * 1ll * F[r][c]) % MOD);
    }
    printf("%d\n", ans);
  }
  return 0;
}
