#include <bits/stdc++.h>
using namespace std;
const int maxN = 2e5 + 5;
const long long INF = 1e18;
const long long MOD = 1e9 + 7;
long long gcd(long long a, long long b) { return !b ? a : gcd(b, a % b); }
long long sq(long long x) { return (x * x) % MOD; }
long long modP(long long a, long long b) {
  return (!b ? 1 : (sq(modP(a, b / 2)) * (b % 2 ? a : 1)) % MOD);
}
int a[maxN], prv[5 * maxN];
int D[5 * maxN];
long long fen[maxN], ans[maxN];
vector<pair<int, int> > Q[maxN];
int mul(long long x, long long y) { return (x * y) % MOD; }
void update(int p, int x) {
  for (p++; p < maxN; p += p & -p) fen[p] = mul(fen[p], x);
}
int get(int p) {
  long long res = 1;
  for (; p > 0; p -= p & -p) res = mul(res, fen[p]);
  return res;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  iota(D, D + 5 * maxN, 0);
  memset(prv, -1, sizeof prv);
  for (int i = 0; i < maxN; i++) fen[i] = 1;
  for (int i = 2; i * i < 5 * maxN; i++) {
    if (D[i] == i) {
      for (int j = i * i; j < 5 * maxN; j += i) {
        D[j] = i;
      }
    }
  }
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int l, r;
    cin >> l >> r;
    l--;
    r--;
    Q[r].push_back({i, l});
  }
  for (int i = 0; i < n; i++) {
    update(i, a[i]);
    while (a[i] != 1) {
      int d = D[a[i]];
      while (a[i] % d == 0) a[i] /= d;
      if (prv[d] != -1) {
        update(prv[d], mul(d, modP(d - 1, MOD - 2)));
      }
      prv[d] = i;
      update(i, mul(d - 1, modP(d, MOD - 2)));
    }
    for (auto pp : Q[i]) {
      int l = pp.second;
      int r = i + 1;
      int ind = pp.first;
      ans[ind] = mul(get(r), modP(get(l), MOD - 2));
    }
  }
  for (int i = 0; i < q; i++) cout << ans[i] << "\n";
  return 0;
}
