WA on 5
#include<bits/stdc++.h>
#define ld long double
#define ui unsigned int
#define ull unsigned long long
#define int long long
#define eb emplace_back
#define pb pop_back
#define ins insert
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define power(x) ((x)*(x))
using namespace std;
namespace FastIO
{
template<typename T=int> inline T read()
{
T s=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
return s*w;
}
template<typename T> inline void read(T &s)
{
s=0; int w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
s=s*w;
}
template<typename T,typename... Args> inline void read(T &x,Args &...args)
{
read(x),read(args...);
}
template<typename T> inline void write(T x,char ch)
{
if(x<0) x=-x,putchar('-');
static char stk[25]; int top=0;
do {stk[top++]=x%10+'0',x/=10;} while(x);
while(top) putchar(stk[--top]);
if(ch!='~') putchar(ch);
return;
}
}
using namespace FastIO;
namespace MTool
{
#define TA template<typename T,typename... Args>
#define TT template<typename T>
static const int Mod=1e9+7;
TT inline void Swp(T &a,T &b) {T t=a;a=b;b=t;}
TT inline void cmax(T &a,T b) {a=max(a,b);}
TT inline void cmin(T &a,T b) {a=min(a,b);}
TA inline void cmax(T &a,T b,Args... args) {a=max({a,b,args...});}
TA inline void cmin(T &a,T b,Args... args) {a=min({a,b,args...});}
TT inline void Madd(T &a,T b) {a=a+b>=Mod?a+b-Mod:a+b;}
TT inline void Mdel(T &a,T b) {a=a-b<0?a-b+Mod:a-b;}
TT inline void Mmul(T &a,T b) {a=a*b%Mod;}
TT inline void Mmod(T &a) {a=(a%Mod+Mod)%Mod;}
TT inline T Cadd(T a,T b) {return a+b>=Mod?a+b-Mod:a+b;}
TT inline T Cdel(T a,T b) {return a-b<0?a-b+Mod:a-b;}
TT inline T Cmul(T a,T b) {return a*b%Mod;}
TT inline T Cmod(T a) {return (a%Mod+Mod)%Mod;}
TA inline void Madd(T &a,T b,Args... args) {Madd(a,Cadd(b,args...));}
TA inline void Mdel(T &a,T b,Args... args) {Mdel(a,Cadd(b,args...));}
TA inline void Mmul(T &a,T b,Args... args) {Mmul(a,Cmul(b,args...));}
TA inline T Cadd(T a,T b,Args... args) {return Cadd(Cadd(a,b),args...);}
TA inline T Cdel(T a,T b,Args... args) {return Cdel(Cdel(a,b),args...);}
TA inline T Cmul(T a,T b,Args... args) {return Cmul(Cmul(a,b),args...);}
TT inline T qpow(T a,T b) {int res=1; while(b) {if(b&1) Mmul(res,a); Mmul(a,a); b>>=1;} return res;}
TT inline T qmul(T a,T b) {int res=0; while(b) {if(b&1) Madd(res,a); Madd(a,a); b>>=1;} return res;}
TT inline T spow(T a,T b) {int res=1; while(b) {if(b&1) res=qmul(res,a); a=qmul(a,a); b>>=1;} return res;}
TT inline void exgcd(T A,T B,T &X,T &Y) {if(!B) return X=1,Y=0,void(); exgcd(B,A%B,Y,X),Y-=X*(A/B);}
TT inline T Ginv(T x) {T A=0,B=0; exgcd(x,Mod,A,B); return Cmod(A);}
#undef TT
#undef TA
}
using namespace MTool;
inline void file()
{
freopen(".in","r",stdin);
freopen(".out","w",stdout);
return;
}
bool Mbe;
namespace wycyyy
{
static const int MAX=200010;
static const int inf=2147483647;
static const int INF=4557430888798830399;
int n,m,blo,now,a[MAX];
signed buc[MAX<<1],sum[MAX][170];
int pfac[MAX][5],pcnt[MAX];
vector<int> fact; int d[MAX<<1],cnt;
struct query{signed l,r,id;}q[MAX]; int ans[MAX];
#define nows (sum[q[i].r][j]-sum[q[i].l-1][j])
namespace Math
{
namespace Sieve
{
constexpr int N=1000;
int vis[N+10],P[N],Pcnt;
inline void Linear_Sieve()
{
for(int i=2;i<=N;++i)
{
if(!vis[i]) P[++Pcnt]=i;
for(int j=1;j<=Pcnt&&i*P[j]<=N;++j) {vis[i*P[j]]=1; if(!i%P[j]) break;}
}
}
inline void SmallDeco(int i) {memcpy(sum[i],sum[i-1],sizeof sum[i]); for(int j=1;j<=Pcnt;++j) while(!a[i]%P[j]) ++sum[i][j],a[i]/=P[j];}
}
using namespace Sieve;
namespace PrimeFactorization
{
int seed,step;
static const int P[]={2,3,5,7,11,13,17,19,23,29,31,37};
static const int Pcnt=12;
inline int qmul(int a,int b,int mod) {int ans=a*b-(int)((long double)a*b/mod+0.5)*mod; return ans<0?ans+mod:ans;}
inline int qpow(int a,int b,int mod) {int res=1; while(b) {if(b&1) res=qmul(res,a,mod); a=qmul(a,a,mod); b>>=1;} return res;}
inline int f(int x,int mod) {return (qmul(x,x,mod)+seed)%mod;}
inline int randoom(int l,int r)
{
static mt19937_64 sd(20070707^time(NULL));
static uniform_int_distribution<int> range(l,r);
return range(sd);
}
inline bool Miller_Robin(int x)
{
if(x<=2) return x==2;
int y_=x-1; while(!(y_&1)) y_>>=1;
for(int i=0;i<Pcnt;++i)
{
if(x==P[i]) return 1;
int flag=0,y=y_,z=qpow(P[i],y,x);
if(z==1) flag=1;
else while(y<x-1)
{
if(z==x-1) {flag=1; break;}
y<<=1,z=qmul(z,z,x);
}
if(!flag) return 0;
}
return 1;
}
inline int floyd(int x)
{
seed=randoom(0,x-1);
int fast,slow,res=1; fast=slow=randoom(0,x-1);
fast=f(fast,x);
for(int i=0;slow!=fast;++i)
{
res=qmul(res,(fast-slow)%x+x,x);
if(!res) res=(fast-slow)%x+x;
if(i%step==0) {int g=gcd(res,x); if(g!=1) return g; res=1;}
slow=f(slow,x),fast=f(f(fast,x),x);
}
return gcd(res,x);
}
inline void Pollard_Rho(int x)
{
if(x==1) return;
if(Miller_Robin(x)) return fact.eb(x),void();
int k=1;
step=((int)log(x))<<1|1;
while(k==1) k=floyd(x);
Pollard_Rho(k),Pollard_Rho(x/k);
}
inline void BigDeco(int i) {fact.clear(),Pollard_Rho(a[i]); for(auto it:fact) d[++cnt]=it,pfac[i][++pcnt[i]]=it;}
}
using namespace PrimeFactorization;
}
using namespace Math;
inline void mian()
{
read(n),blo=n/sqrt((m<<1)/3),Linear_Sieve(),now=1;
for(int i=1;i<=n;++i) read(a[i]),SmallDeco(i),BigDeco(i);
sort(d+1,d+cnt+1),cnt=unique(d+1,d+cnt+1)-d-1;
for(int i=1;i<=n;++i) for(int j=1;j<=pcnt[i];++j) pfac[i][j]=lower_bound(d+1,d+cnt+1,pfac[i][j])-d;
read(m); for(int i=1;i<=m;++i) read(q[i].l,q[i].r),q[i].id=i;
sort(q+1,q+m+1,[](query a,query b){return (a.l/blo)!=(b.l/blo)?(a.l/blo)<(b.l/blo):((a.l/blo)&1)?(a.r<b.r):(a.r>b.r);});
auto Add=[&](int x)->void{for(int i=1;i<=pcnt[x];++i) {if(buc[pfac[x][i]]==0) Mmul(now,d[pfac[x][i]]-1); else Mmul(now,d[pfac[x][i]]); ++buc[pfac[x][i]];}};
auto Del=[&](int x)->void{for(int i=1;i<=pcnt[x];++i) {if(buc[pfac[x][i]]==1) Mmul(now,Ginv(d[pfac[x][i]]-1)); else Mmul(now,Ginv(d[pfac[x][i]])); --buc[pfac[x][i]];}};
for(int i=1,l=1,r=0;i<=m;++i)
{
while(l>q[i].l) Add(--l);
while(r<q[i].r) Add(++r);
while(l<q[i].l) Del(l++);
while(r>q[i].r) Del(r--);
ans[q[i].id]=now; for(int j=1;j<=Math::Sieve::Pcnt;++j) if(nows) Mmul(ans[q[i].id],Math::Sieve::P[j]-1,MTool::qpow(Math::Sieve::P[j],nows*1ll-1));
}
for(int i=1;i<=m;++i) write(ans[i],'\n');
}
}
bool Med;
signed main()
{
// file();
fprintf(stderr,"%.3lf MB\n",abs(&Med-&Mbe)/1048576.0);
int Tbe=clock();
wycyyy::mian();
int Ted=clock();
cerr<<1e3*(Ted-Tbe)/CLOCKS_PER_SEC<<" ms\n";
return (0-0);
}