#include <bits/stdc++.h>
const long double EPS = 1e-10;
const int MOD = 1000000007ll;
const int mod1 = 1000000009ll;
const int mod2 = 1100000009ll;
int INF = (int)1e9;
long long int INFINF = (long long int)1e18;
int debug = 0;
long double PI = acos(-1.0);
using namespace std;
int bit_count(long long int _x) {
  long long int _ret = 0;
  while (_x) {
    if (_x % 2 == 1) _ret++;
    _x /= 2;
  }
  return _ret;
}
int bit(long long int _mask, int _i) {
  return (_mask & (1ll << _i)) == 0 ? 0 : 1;
}
int powermod(long long int _a, long long int _b, int _m = MOD) {
  long long int _r = 1;
  while (_b) {
    if (_b % 2 == 1) _r = (_r * _a) % _m;
    _b /= 2;
    _a = (_a * _a) % _m;
  }
  return _r;
}
int add(int a, int b, int m = MOD) {
  int x = a + b;
  while (x >= m) x -= m;
  while (x < 0) x += m;
  return x;
}
int sub(int a, int b, int m = MOD) {
  int x = a - b;
  while (x < 0) x += m;
  while (x >= m) x -= m;
  return x;
}
int mul(int a, int b, int m = MOD) {
  long long int x = a * 1ll * b;
  x %= m;
  while (x < 0) x += m;
  return (int)x;
}
int ldtoint(long double x) { return (int)(x + 0.5); }
long long int ldtolli(long double x) { return (long long int)(x + 0.5); }
template <class T1, class T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
  os << "[" << p.first << "," << p.second << "]";
  return os;
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "[";
  bool first = true;
  for (T it : v) {
    if (!first) os << ", ";
    first = false;
    os << it;
  }
  os << "]";
  return os;
}
template <class T>
ostream& operator<<(ostream& os, set<T>& v) {
  os << "[";
  bool first = true;
  for (T it : v) {
    if (!first) os << ", ";
    first = false;
    os << it;
  }
  os << "]";
  return os;
}
template <class T1, class T2>
ostream& operator<<(ostream& os, map<T1, T2>& v) {
  os << "[";
  bool first = true;
  for (pair<T1, T2> it : v) {
    if (!first) os << ", ";
    first = false;
    os << "(" << it.first << "," << it.second << ")";
  }
  os << "]";
  return os;
}
namespace Sieve {
const int MAXN = 1000010;
int N;
bool isp[MAXN];
vector<pair<int, int> > pfactors[MAXN];
void init(int _N) {
  N = _N;
  for (int i = 2; i <= N; i++) isp[i] = true;
  for (int i = 2; i <= N; i++) {
    if (isp[i]) {
      pfactors[i].push_back({i, 1});
      for (int j = i + i; j <= N; j += i) {
        int cnt = 0;
        int x = j;
        while (x % i == 0) {
          cnt++;
          x /= i;
        }
        pfactors[j].push_back({i, cnt});
        isp[j] = false;
      }
    }
  }
}
}  // namespace Sieve
int Q, R, N;
int M = 1000000;
int dp[1000010][21];
int sum[25];
int main() {
  if (0) {
    freopen("input.txt", "r", stdin);
    debug = 1;
    M = 100;
  }
  srand(time(NULL));
  Sieve::init(M);
  dp[0][0] = 1;
  for (int i = 1; i < 21; i++) dp[0][i] = 2;
  for (int r = 1; r <= M; r++) {
    sum[0] = dp[r - 1][0];
    for (int i = 1; i < 21; i++) sum[i] = add(dp[r - 1][i], sum[i - 1]);
    for (int i = 0; i < 21; i++) dp[r][i] = sum[i];
  }
  scanf("%d", &Q);
  while (Q--) {
    scanf("%d", &R);
    scanf("%d", &N);
    int ans = 1;
    for (pair<int, int> it : Sieve::pfactors[N]) {
      int p = it.first;
      int a = it.second;
      ans = mul(ans, dp[R][a]);
    }
    printf("%d\n", ans);
  }
  return 0;
}
