#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
vector<int>a(200005);
struct segtree{
int ls,rs,mul;
}sg[15000000];
int si=0;
vector<int>rt(200005),vis(1000005);
void push_up(int root){
sg[root].mul=1LL*sg[sg[root].ls].mul*sg[sg[root].rs].mul%mod;
}
void build(int &root,int l,int r){
root=++si;
if(l==r){
sg[root].mul=1;
return;
}
int mid=l+r>>1;
build(sg[root].ls,l,mid);
build(sg[root].rs,mid+1,r);
push_up(root);
}
void upd(int &root,int pre,int l,int r,int p,long long x){
if(p<l||p>r) return;
root=++si;
sg[root].ls=sg[pre].ls;
sg[root].rs=sg[pre].rs;
sg[root].mul=1LL*sg[pre].mul*x%mod;
if(l==r){
return;
}
int mid=l+r>>1;
upd(sg[root].ls,sg[pre].ls,l,mid,p,x);
upd(sg[root].rs,sg[pre].rs,mid+1,r,p,x);
}
int query(int root,int l,int r,int ql,int qr){
if(qr<l||ql>r) return 1;
if(ql<=l&&r<=qr){
return sg[root].mul;
}
int mid=l+r>>1;
return 1LL*query(sg[root].ls,l,mid,ql,qr)*query(sg[root].rs,mid+1,r,ql,qr)%mod;
}
int fpow(int b,int n){
int ans=1;
while(n){
if(n&1) ans=1LL*ans*b%mod;
b=1LL*b*b%mod;
n>>=1;
}
return ans;
}
int inv(int x){
return fpow(x,mod-2);
}
void solve(){
int n,m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(rt[0],1,n);
for(int i=1;i<=n;i++){
rt[i]=rt[i-1];
int t=a[i];
for(int j=2;j<=sqrt(t);j++){
int cnt=0;
while(t%j==0){
t/=j;
cnt++;
}
if(!cnt) continue;
if(vis[j]){
upd(rt[i],rt[i],1,n,vis[j],1LL*j*inv(j-1)%mod);
upd(rt[i],rt[i],1,n,i,1LL*(j-1)*fpow(j,cnt-1)%mod);
}
else{
upd(rt[i],rt[i],1,n,i,1LL*(j-1)*fpow(j,cnt-1)%mod);
}
vis[j]=i;
}
if(t>1){
if(vis[t]){
upd(rt[i],rt[i],1,n,vis[t],1LL*t*inv(t-1)%mod);
upd(rt[i],rt[i],1,n,i,1LL*(t-1));
}
else{
upd(rt[i],rt[i],1,n,i,1LL*(t-1));
}
vis[t]=i;
}
}
cin>>m;
while(m--){
int ql,qr;
cin>>ql>>qr;
cout<<query(rt[qr],1,n,ql,qr)<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T=1;
while(T--) solve();
return 0;
}