#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define all(p) (p).begin(),(p).end()
#include <atcoder/modint>
using mint = atcoder::modint998244353;
#include <atcoder/segtree>
mint op(mint a, mint b){
	return a * b;
}
mint e(){
	return 1;
}

vector<mint> solve_off(int N, vector<int> A, int Q, vector<int> L, vector<int> R){
	const int B = 200'200;
	vector<vector<int>> table(B);
	rep(i, 2, B) if (table[i].empty()){
		ll tmp = i;
		while (tmp < B){
			for (int j = tmp; j < B; j += tmp){
				table[j].push_back(tmp);
			}
			tmp *= i;
		}
	}
	vector<vector<int>> G(B);
	vector<int> ind(B);
	atcoder::segtree<mint, op, e> seg(N);
	rep(i, 0, N){
		int tmp = 1;
		for (auto x : table[A[i]]){
			if (G[x].empty()){
				tmp *= table[x].front();
			}
			G[x].push_back(i);
		}
		seg.set(i, tmp);
	}
    rep(i, 0, Q) L[i]--;
	vector<int> order(Q);
	rep(i, 0, Q) order[i] = i;
	sort(all(order), [&](int l, int r){
		return L[l] < L[r];
	});
	vector<mint> ans(Q);
	int l = 0;
	for (auto id : order){
		while (l < L[id]){
			for (auto x : table[A[l]]){
				ind[x]++;
				if (ind[x] < (int)G[x].size()){
					int a = G[x][ind[x]];
					seg.set(a, seg.get(a) * table[x].front());
				}
			}
			l++;
		}
		ans[id] = seg.prod(L[id], R[id]);
	}
    return ans;
}

int main(){
	ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    cin >> N;
    vector<int> A(N);
    rep(i, 0, N) cin >> A[i];
    int Q;
    cin >> Q;
    vector<int> L(Q), R(Q);
    rep(i, 0, Q) cin >> L[i] >> R[i];
    auto ans = solve_off(N, A, Q, L, R);
    for (auto x : ans){
        cout << x.val() << "\n";
    }
}