#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"; } }