#include<bits/stdc++.h>
#define maxn 200005
//#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=500;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=500;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[20005],mx[maxn*30],tot,Ls[maxn*30],Rs[maxn*30];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)
	{
		return 0;
//		now=++tot;
//		if(tot>=4000000)
//		{
//			cout<<"gg"<<endl;
//			exit(0);
//		}
	}
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<7],rs[maxn<<7],tr[maxn<<7],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
//		cout<<l<<' '<<r<<' '<<now<<' '<<tr[now]<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	return 1;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
//		cout<<a[i]<<' '<<vv<<endl;
//		cout<<vv*a[i]%mod<<endl;
//		cout<<nxt[i]-1<<endl;
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
//	cout<<getsum(root[20],)
}

signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 100005
#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=500;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=500;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[505],mx[maxn*17],tot,Ls[maxn*17],Rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<5],rs[maxn<<5],tr[maxn<<5],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
//		cout<<l<<' '<<r<<' '<<now<<' '<<tr[now]<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
//	for(int i=1;i<=n;i++)
//		cout<<s[i]<<' ';
//	cout<<endl;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
//		cout<<a[i]<<' '<<vv<<endl;
//		cout<<vv*a[i]%mod<<endl;
//		cout<<nxt[i]-1<<endl;
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
//	cout<<getsum(root[20],)
}

signed main()
{
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(n==1000)
		{
		cout<<a[i]<<' ';
		if(i%100==0)	cout<<endl;
		}
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
//		cout<<i<<' '<<a[i]<<endl;
	}
//	cout<<endl;
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
//		cout<<last<<endl;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
//		cout<<getsum(root[l-1],1,n,r,n)<<' '<<s[r]<<endl;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 100005
#define ll long long
#define mod 1000000007
using namespace std;

bool is_prime[450];
int p[450],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=450;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=450;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[450],mx[maxn*17],tot,ls[maxn*17],rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void ins(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	ins(ls[now],l,mid,x,v);
	else ins(rs[now],mid+1,r,x,v);
	mx[now]=max(mx[ls[now]],mx[rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

signed main()
{
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	ins(rt[j],1,n,i,num);
		}
	}
	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 200005
//#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=500;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=500;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[20005],mx[maxn*30],tot,Ls[maxn*30],Rs[maxn*30];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)
	{
		now=++tot;
		if(tot>=4000000)
		{
			cout<<"gg"<<endl;
			exit(0);
		}
	}
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<7],rs[maxn<<7],tr[maxn<<7],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
//		cout<<l<<' '<<r<<' '<<now<<' '<<tr[now]<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
//		cout<<a[i]<<' '<<vv<<endl;
//		cout<<vv*a[i]%mod<<endl;
//		cout<<nxt[i]-1<<endl;
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
//	cout<<getsum(root[20],)
}

signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
		cout<<last<<endl;
	}

}


//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
using namespace std;

typedef long long LL;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const int N=1e5+100;

const int mod=1e9+7;

int num[N],a[N],last[N<<1],n,seg_cnt;
/*???*/
struct Seg_tree
{
	int mmax[262626];
	int base=131072;
	void build()
	{
		for(int i=0;i<n;i++)
			mmax[base+i]=num[i+1];
		for(int i=base-1;i>=1;i--)
			mmax[i]=max(mmax[i<<1],mmax[i<<1|1]);
	}
	int query(int k,int l,int r)
	{
		l+=base;r+=base;
		l--;r--;
		int ans=0;
		while(l<=r)
		{
			if(l&1)
			{
				ans=max(ans,mmax[l]);
				l++;
			}
			if(~r&1)
			{
				ans=max(ans,mmax[r]);
				r--;
			}
			l>>=1;r>>=1;
		}
		return ans;
	}
}seg[105];
/*???*/
/*???*/
struct Node
{
	int l,r;
	LL sum;
}tree[N*40];

int cnt,root[N];

void update(int pos,int &k,int l,int r,LL val)
{
	tree[cnt++]=tree[k];
	k=cnt-1;
	tree[k].sum=max(tree[k].sum,1LL)*val%mod;
	if(l==r)
		return;
	int mid=l+r>>1;
	if(pos<=mid)
		update(pos,tree[k].l,l,mid,val);
	else
		update(pos,tree[k].r,mid+1,r,val);
}

LL query(int rt,int l,int r,int L,int R)//[l,r]:????,[L,R]:????
{
	if(R<l||L>r)
		return 1;
	if(L>=l&&R<=r)
		return max(tree[rt].sum,1LL);
	int mid=L+R>>1;
	return query(tree[rt].l,l,r,L,mid)*query(tree[rt].r,l,r,mid+1,R)%mod;
}

void init()
{
	root[0]=0;
	tree[0].l=tree[0].r=tree[0].sum=0;
	cnt=1;
}
/*???*/
/*???+??*/
LL q_pow(LL a,LL b)
{
	LL ans=1;
	while(b)
	{
		if(b&1)
			ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}

LL inv(LL num)
{
	return q_pow(num,mod-2);
}
/*???+??*/
/*???*/
bool vis[N<<1];

void P()
{
	for(int i=2;i<=500;i++)
	{
		if(vis[i])
			continue;
		for(int j=1;j<=n;j++)
		{
			num[j]=1;
			while(a[j]%i==0)
			{
				a[j]/=i;
				num[j]*=i;
			}
		}
		seg_cnt++;
		seg[seg_cnt].build();
		for(int j=i+i;j<N<<1;j+=i)
			vis[j]=true;
	}
}
/*???*/
int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//	ios::sync_with_stdio(false);
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",a+i);
	P();
	//???????a[i]????500????
	for(int i=1;i<=n;i++)
	{
		root[i]=root[i-1];
		if(a[i]==1)
			continue;
		if(last[a[i]])
			update(last[a[i]],root[i],1,n,inv(a[i]));
		update(i,root[i],1,n,a[i]);
		last[a[i]]=i;
	}
	int m;
	scanf("%d",&m);
	LL last=0;
	while(m--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1;
		r=(r+last)%n+1;
		if(l>r)
			swap(l,r);
		LL ans=1;
		for(int i=1;i<=seg_cnt;i++)
			ans=ans*seg[i].query(1,l,r)%mod;
		if(n==1000)cout<<ans<<endl;
		ans=ans*query(root[r],l,r,1,n)%mod;
		printf("%lld\n",last=ans);
	}
	return 0;
}


#include<bits/stdc++.h>
#define maxn 200005
#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=500;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=500;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[20005],mx[maxn*17],tot,Ls[maxn*17],Rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<5],rs[maxn<<5],tr[maxn<<5],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
//		cout<<l<<' '<<r<<' '<<now<<' '<<tr[now]<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
//		cout<<a[i]<<' '<<vv<<endl;
//		cout<<vv*a[i]%mod<<endl;
//		cout<<nxt[i]-1<<endl;
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
//	cout<<getsum(root[20],)
}

signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
//		if(n==1000)
//		cout<<l<<' '<<r<<endl;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
//		if(n==1000)cout<<last<<endl;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
//		cout<<1ll*getsum(root[l-1],1,n,r,n)*s[r]%mod<<endl;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 300005
#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=500;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=500;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[20005],mx[maxn*17],tot,Ls[maxn*17],Rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<7],rs[maxn<<7],tr[maxn<<7],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
//		cout<<l<<' '<<r<<' '<<now<<' '<<tr[now]<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
//		cout<<a[i]<<' '<<vv<<endl;
//		cout<<vv*a[i]%mod<<endl;
//		cout<<nxt[i]-1<<endl;
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
//	cout<<getsum(root[20],)
}

signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
//		if(n==1000)
//		cout<<l<<' '<<r<<endl;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
//		if(n==1000)cout<<last<<endl;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
//		cout<<1ll*getsum(root[l-1],1,n,r,n)*s[r]%mod<<endl;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 200005
#define mod 1000000007
using namespace std;

int n,q,a[100005],pre[200005],rt[2000005],id[100005],tot,num;

int is_prime[200005],fac[200005];		//´æµÄÊÇµ±Ç°µÄÊýµÄ×îÐ¡µÄÖÊÒò×Ó

int inv[maxn];

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

void init()
{
	for(int i=2;i<=200000;i++)
	{
		if(is_prime[i])	continue;
		fac[i]=i;
		for(int j=2*i;j<=200000;j+=i)
			if(!fac[j])	fac[j]=i,is_prime[j]=1;
	}
	for(int i=1;i<=200000;i++)	inv[i]=ksm(i,mod-2);
}

int tr[30000000],ls[30000000],rs[30000000];

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		tr[now]=1ll*max(1,tr[pre])*v%mod;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*max(tr[ls[now]],1)*max(tr[rs[now]],1)%mod;
	return;
}

int get(int now,int l,int r,int x,int y)
{
	if(!now)	return 1;
	if(x<=l && r<=y)	return max(1,tr[now]);
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)	sum=1ll*sum*max(1,get(ls[now],l,mid,x,y))%mod;
	if(y>mid)	sum=1ll*sum*max(1,get(rs[now],mid+1,r,x,y))%mod;
	return sum;
}

signed main()
{
	init();
	cin>>n;
	++num;++tot;
	rt[num]==tot;
	id[0]=num;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		int now=a[i];
		while(fac[now])		//¶ÔÓÚÍ¬Ò»¸ö¶«Î÷ÎÒÖ±½ÓÕâÑù¸ã
		{
			int tt=fac[now],k=1;
			while(now%tt==0)
			{
				k=k*tt;
				if(pre[k])
				{
					++num;
					ins(rt[num],rt[num-1],1,n,pre[k],inv[tt]);
				}
				now/=tt;
				pre[k]=i;
			}
		}
//		for(int j=1;j<=10;j++)
//			cout<<pre[j]<<' ';
//		cout<<endl;
		++num;
//		if(i==3)	cout<<a[i]<<' '<<get(rt[num],1,n,i,i)<<endl;
		id[i]=num;
		ins(rt[num],rt[num-1],1,n,i,a[i]);
//		if(i==3)	cout<<a[i]<<' '<<get(rt[num],1,n,i,i)<<endl;
	}
	int last=0;
	cin>>q;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(l+last)%n+1;
		r=(r+last)%n+1;
//		cout<<l<<' '<<r<<endl;
		if(l>r)	swap(l,r);
		int ans=get(rt[id[r]],1,n,l,r);
		cout<<ans<<endl;
		last=ans;
	}

}


#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define maxn 200005
//#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//先求出所有质数
{
	for(int i=2;i<=450;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=450;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[20005],mx[maxn*30],tot,Ls[maxn*30],Rs[maxn*30];		//每个质数的根

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	return 0;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//下一个和自己一样的

int root[maxn],ls[maxn<<7],rs[maxn<<7],tr[maxn<<7],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//现在变化的是左子树
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	return 1;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//不管有没有先搞上再说
	tr[1]=tr[0]=1;		//每建一个新节点  先无脑赋值为1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
}

signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	init();
	cin>>n;
	int a1=0;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(i==1)	a1=a[1];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 500005
#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=500;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=500;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[20005],mx[maxn*17],tot,Ls[maxn*17],Rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<7],rs[maxn<<7],tr[maxn<<7],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
//		cout<<l<<' '<<r<<' '<<now<<' '<<tr[now]<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
//		cout<<a[i]<<' '<<vv<<endl;
//		cout<<vv*a[i]%mod<<endl;
//		cout<<nxt[i]-1<<endl;
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
//	cout<<getsum(root[20],)
}

signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
//		if(n==1000)
//		cout<<l<<' '<<r<<endl;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
//		if(n==1000)cout<<last<<endl;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
//		cout<<1ll*getsum(root[l-1],1,n,r,n)*s[r]%mod<<endl;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 200005
#define mod 1000000007
using namespace std;

int n,q,a[100005],pre[200005],rt[2000005],id[100005],tot,num;

int is_prime[200005],fac[200005];		//´æµÄÊÇµ±Ç°µÄÊýµÄ×îÐ¡µÄÖÊÒò×Ó

int inv[maxn];

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

void init()
{
	for(int i=2;i<=200000;i++)
	{
		if(is_prime[i])	continue;
		fac[i]=i;
		for(int j=2*i;j<=200000;j+=i)
			if(!fac[j])	fac[j]=i,is_prime[j]=1;
	}
	for(int i=1;i<=200000;i++)	inv[i]=ksm(i,mod-2);
}

int tr[20000000],ls[20000000],rs[20000000];

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		tr[now]=1ll*max(1,tr[pre])*v%mod;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*max(tr[ls[now]],1)*max(tr[rs[now]],1)%mod;
	return;
}

int get(int now,int l,int r,int x,int y)
{
	if(!now)	return 1;
	if(x<=l && r<=y)	return max(1,tr[now]);
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)	sum=1ll*sum*max(1,get(ls[now],l,mid,x,y))%mod;
	if(y>mid)	sum=1ll*sum*max(1,get(rs[now],mid+1,r,x,y))%mod;
	return sum;
}

signed main()
{
	init();
	cin>>n;
	++num;++tot;
	rt[num]==tot;
	id[0]=num;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		int now=a[i];
		while(fac[now])		//¶ÔÓÚÍ¬Ò»¸ö¶«Î÷ÎÒÖ±½ÓÕâÑù¸ã
		{
			int tt=fac[now],k=1;
			while(now%tt==0)
			{
				if(pre[tt])
				{
					++num;
					ins(rt[num],rt[num-1],1,n,pre[tt],inv[tt]);
				}
				k=k*tt;
				now/=tt;
				pre[k]=i;
			}
		}
		++num;
		id[i]=num;
		ins(rt[num],rt[num-1],1,n,i,a[i]);
	}
	int last=0;
	cin>>q;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(l+last)%n+1;
		r=(r+last)%n+1;
//		cout<<l<<' '<<r<<endl;
		if(l>r)	swap(l,r);
		int ans=get(rt[id[r]],1,n,l,r);
		cout<<ans<<endl;
		last=ans;
	}

}


#include<bits/stdc++.h>
#define maxn 100005
#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[200005],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=200000;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=200000;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[200005],mx[maxn*50],tot,Ls[maxn*50],Rs[maxn*50];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<5],rs[maxn<<5],tr[maxn<<5],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		tr[now]=1ll*tr[now]*v%mod;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
		ins(root[i],root[i-1],1,n,nxt[i]-1,ksm(a[i],mod-2));
}

signed main()
{
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
//	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
//		if(n==1000)	cout<<last<<endl;
//		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 200005
//#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[505],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=500;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=500;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[20005],mx[maxn*17],tot,Ls[maxn*17],Rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<7],rs[maxn<<7],tr[maxn<<7],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		if(tr[pre]==1)	tr[pre]=1;
		tr[now]=1ll*tr[pre]*v%mod;
//		cout<<l<<' '<<r<<' '<<now<<' '<<tr[now]<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
	{
		if(a[i]==1)
		{
			root[i]=root[i-1];
			continue;
		}
		int vv=ksm(a[i],mod-2);
//		cout<<a[i]<<' '<<vv<<endl;
//		cout<<vv*a[i]%mod<<endl;
//		cout<<nxt[i]-1<<endl;
		ins(root[i],root[i-1],1,n,nxt[i]-1,vv);
	}
//	cout<<getsum(root[20],)
}

signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 100005
#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[500];
int p[500],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=450;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=450;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[450],mx[maxn*17],tot,Ls[maxn*17],Rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<5],rs[maxn<<5],tr[maxn<<5],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		tr[now]=1ll*tr[now]*v%mod;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
		ins(root[i],root[i-1],1,n,nxt[i]-1,ksm(a[i],mod-2));
}

signed main()
{
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
//		if(n==1000)	cout<<last<<endl;
		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
		cout<<last<<endl;
	}

}


#include<bits/stdc++.h>
#define maxn 100005
#define int long long
#define mod 1000000007
using namespace std;

bool is_prime[200005];
int p[200005],cnt;

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=200000;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=200000;j+=i)
			is_prime[j]=1;
	}
}

int n,a[maxn],q;

int rt[200005],mx[maxn*17],tot,Ls[maxn*17],Rs[maxn*17];		//Ã¿¸öÖÊÊýµÄ¸ù

void modify(int &now,int l,int r,int x,int v)
{
	if(!now)	now=++tot;
	if(l==r)
	{
		mx[now]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)	modify(Ls[now],l,mid,x,v);
	else modify(Rs[now],mid+1,r,x,v);
	mx[now]=max(mx[Ls[now]],mx[Rs[now]]);
	return;
}

int get(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot;
	if(x<=l && r<=y)
	{
		return mx[now];
	}
	int mid=(l+r)>>1,ma=0;
	if(x<=mid)	ma=max(ma,get(Ls[now],l,mid,x,y));
	if(y>mid)	ma=max(ma,get(Rs[now],mid+1,r,x,y));
	return ma;
}

int ksm(int aa,int t)
{
	int bb=1;
	while(t)
	{
		if(t&1)	bb=1ll*aa*bb%mod;
		aa=1ll*aa*aa%mod;
		t>>=1;
	}
	return bb;
}

int nxt[maxn],pre[maxn<<1],vis[maxn],s[maxn];			//ÏÂÒ»¸öºÍ×Ô¼ºÒ»ÑùµÄ

int root[maxn],ls[maxn<<5],rs[maxn<<5],tr[maxn<<5],tot2;

void ins(int &now,int pre,int l,int r,int x,int v)
{
	if(!now)
	{
		now=++tot2;
		tr[now]=1;
	}
	if(l==r)
	{
		tr[now]=1ll*tr[now]*v%mod;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)		//ÏÖÔÚ±ä»¯µÄÊÇ×ó×ÓÊ÷
	{
		rs[now]=rs[pre];
		ins(ls[now],ls[pre],l,mid,x,v);
	}
	else
	{
		ls[now]=ls[pre];
		ins(rs[now],rs[pre],mid+1,r,x,v);
	}
	tr[now]=1ll*tr[ls[now]]*tr[rs[now]]%mod;
	return;
}

int getsum(int &now,int l,int r,int x,int y)
{
	if(!now)	now=++tot2;
	if(x<=l && r<=y)
	{
		if(tr[now]==0)	return 1;
		return tr[now];
	}
	int mid=(l+r)>>1,sum=1;
	if(x<=mid)
	{
		int tt=getsum(ls[now],l,mid,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	if(y>mid)
	{
		int tt=getsum(rs[now],mid+1,r,x,y);
		if(tt!=0)	sum=1ll*tt*sum%mod;
	}
	return sum;
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		nxt[pre[a[i]]]=i;
		pre[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
		if(!nxt[i])	nxt[i]=n+1;
	for(int i=0;i<=n;i++)
		s[i]=1;
	for(int i=1;i<=n;i++)
		if(!vis[a[i]])
			s[i]=a[i],vis[a[i]]=1;
	for(int i=1;i<=n;i++)
		s[i]=1ll*s[i-1]*s[i]%mod;
	root[1]=++tot2;		//²»¹ÜÓÐÃ»ÓÐÏÈ¸ãÉÏÔÙËµ
	tr[1]=tr[0]=1;		//Ã¿½¨Ò»¸öÐÂ½Úµã  ÏÈÎÞÄÔ¸³ÖµÎª1
	for(int i=1;i<n;i++)
		ins(root[i],root[i-1],1,n,nxt[i]-1,ksm(a[i],mod-2));
}

signed main()
{
	init();
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=cnt;j++)
		{
			int num=0;
			while(a[i]%p[j]==0)
			{
				num++;
				a[i]/=p[j];
			}
			if(num)	modify(rt[j],1,n,i,num);
		}
	}
//	work();

	cin>>q;
	int last=0;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		l=(last+l)%n+1;
		r=(last+r)%n+1;
		last=1;
		if(l>r)	swap(l,r);
		for(int j=1;j<=cnt;j++)
			last=1ll*last*ksm(p[j],get(rt[j],1,n,l,r))%mod;
//		if(n==1000)	cout<<last<<endl;
//		last=1ll*last*s[r]%mod*getsum(root[l-1],1,n,r,n)%mod;
		cout<<last<<endl;
	}

}


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

int n,a[100066];
int w[100066<<2],mul[100066<<2];

void build(int p,int l,int r)
{
	if(l==r)
	{
		w[p]=a[l];
		mul[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	w[p]=gcd(w[p<<1],w[p<<1|1]);
	mul[p]=1ll*mul[p<<1]*mul[p<<1|1]%mod*powmod(w[p],mod-2)%mod;
}

int ans,g;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		if(!g)g=w[p],ans=mul[p];
		else
		{
			g=gcd(g,w[p]);
			ans=1ll*ans*mul[p]%mod*powmod(g,mod-2)%mod;
		}

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g=0;
		query(1,1,n,l,r);
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}


/*
	数的范围设为[1,MAX];
	一个数可以分解成若干个小于根号MAX 和 至多一个大于根号MAX的数相乘。
	小于的部分对每个数用线段树分别维护；
	大于的部分记为ai,对每个位置维护prei表示左边最近的相同值，
	那么对于查询[l,r]，等价于求Πai[l<=i<=r&&prei<l],
	对(prei,ai，i)排序，那么询问区间变为一段前缀，
	用主席树维护排序后的数组，在j位置，在i插入ai，
	回答变为第j棵线段树的[l,r]区间的乘积。

*/

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[566];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i]){v[i]=i;prime.pb(i);}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)break;
			v[i*p]=p;
		}
	}
}

struct Seg
{
	int w[100066<<2][100];
	int PCNT=96;

	void update(int p,int l,int r,int aim,int*val)
	{
		if(l==r)
		{
			for(int i=0;i<PCNT;i++)
				w[p][i]=val[i];
			return ;
		}
		int mid=(l+r)>>1;
		if(aim<=mid)update(p<<1,l,mid,aim,val);
		else update(p<<1|1,mid+1,r,aim,val);
		for(int i=0;i<PCNT;i++)
			w[p][i]=max(w[p<<1][i],w[p<<1|1][i]);
	}

	void query(int p,int l,int r,int ql,int qr,int*ret)
	{
		if(ql<=l&&r<=qr)
		{
			for(int i=0;i<PCNT;i++)
				ret[i]=max(ret[i],w[p][i]);
			return;
		}
		int mid=(l+r)>>1;
		if(ql<=mid)query(p<<1,l,mid,ql,qr,ret);
		if(mid<qr)query(p<<1|1,mid+1,r,ql,qr,ret);
	}
}seg;

struct Chair
{
	int rt[100066<<4];
	int w[100066<<4],ls[100066<<4],rs[100066<<4];
	int tot;

	void build(int&p,int l,int r)
	{
		p=++tot;
		w[p]=1;
		if(l==r)return;
		int mid=(l+r)>>1;
		build(ls[p],l,mid);
		build(rs[p],mid+1,r);
	}

	void update(int p,int&q,int l,int r,int aim,int val)
	{
		q=++tot;
		w[q]=1ll*w[p]*val%mod;ls[q]=ls[p];rs[q]=rs[p];
		if(l==r)return;
		int mid=(l+r)>>1;
		if(aim<=mid)update(ls[p],ls[q],l,mid,aim,val);///////
		else update(rs[p],rs[q],mid+1,r,aim,val);
	}

	int query(int p,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)return w[p];
		int mid=(l+r)>>1,ret=1;
		if(ql<=mid)ret=query(ls[p],l,mid,ql,qr);
		if(mid<qr)ret=1ll*ret*query(rs[p],mid+1,r,ql,qr)%mod;
		return ret;
	}
}chair;

struct Node
{
	int id,pre,w;
	bool operator<(const Node&a)const
	{
		if(pre!=a.pre)return pre<a.pre;
		if(id!=a.id)return id<a.id;
		return w<a.w;
	}
}node[100066];

int n,a[100066];
int cnt[100],pre[200066];

void seperate(int&x)
{
	for(int i=0;i<SZ(prime);i++)
	{
		int p=prime[i];
		if(x%p)continue;
		while(x%p==0)x/=p,cnt[i]++;
		//printf("%d ",p);
	}//puts("");
}

int main()
{
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		memset(cnt,0,sizeof(cnt));
		seperate(a[i]);
		seg.update(1,1,n,i,cnt);
		node[i]=Node{i,pre[a[i]],a[i]};
		pre[a[i]]=i;
		//printf("%d \n",a[i]);
	}
	sort(node+1,node+n+1);
	chair.build(chair.rt[0],1,n);
	for(int i=1;i<=n;i++)
	{
		chair.update(chair.rt[i-1],chair.rt[i],1,n,node[i].id,node[i].w);
		//printf("__%d %d\n",node[i].w,node[i].id);
	}//puts("__");
	int _,last=0;
	scanf("%d",&_);
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		memset(cnt,0,sizeof(cnt));
		seg.query(1,1,n,l,r,cnt);
		int ans=1;
		for(int i=0;i<seg.PCNT;i++)
			ans=1ll*ans*powmod(prime[i],cnt[i])%mod;
	//	printf("%d\n",ans);
		int p=lower_bound(node+1,node+n+1,Node{0,l,0})-node-1;
	//	printf("___%d\n",p);
		ans=1ll*ans*chair.query(chair.rt[p],1,n,l,r)%mod;
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}
/*
3
2 3 5
1
1 3

5
5015 3009 1003 1007 19999
1
1 2

3
5015 3009 1003

*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[1000];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i])
		{
			v[i]=i;prime.pb(i);
		}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)continue;
			v[i*p]=p;
		}
	}
}

int n,a[100066];
map<int,int>Map[100066<<2];
set<int>Set[100066<<2];
int w[100066<<2];

map<int,int> operator+(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=max(ret[p.fi],p.se);
		else ret[p.fi]=p.se;
	}return ret;
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		for(auto i:prime)
		{
			if(a[l]%i)continue;
			int cnt=0;
			while(a[l]%i==0)a[l]/=i,cnt++;
			Map[p][i]=cnt;
		}
		//if(a[l])Map[p][a[l]]=1;
		if(a[l]>1)Set[p].insert(a[l]);
		w[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	Map[p]=Map[p<<1]+Map[p<<1|1];
	w[p]=1ll*w[p<<1]*w[p<<1|1]%mod;
	for(auto x:Set[p<<1])
	{
		Set[p].insert(x);
		if(Set[p<<1|1].find(x)!=Set[p<<1|1].end())
			w[p]=1ll*w[p]*powmod(x,mod-2)%mod;
	}
	for(auto x:Set[p<<1|1])
		Set[p].insert(x);
}

int ans;
map<int,int>g,gg;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		ans=1ll*ans*w[p]%mod;
		if(l==ql)
		{
			g=Map[p];
		}
		else
		{
			g=g+Map[p];
		}

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	init();
//	for(int i=0;i<=10;i++)printf("%d ",prime[i]);puts("");
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g.clear();gg.clear();
		query(1,1,n,l,r);
		//printf("%d __\n",ans);
		for(auto x:g)
		{
			//printf("%d %d\n",x.fi,x.se);
			ans=1ll*ans*powmod(x.fi,x.se)%mod;
			//ans=1ll*ans*powmod(powmod(x.fi,x.se),mod-2)%mod;
		}

		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}

/*
4
1007 19999 2014 51
1
4 3
*/


/*
	数的范围设为[1,MAX];
	一个数可以分解成若干个小于根号MAX 和 至多一个大于根号MAX的数相乘。
	小于的部分对每个数用线段树分别维护；
	大于的部分记为ai,对每个位置维护prei表示左边最近的相同值，
	那么对于查询[l,r]，等价于求Πai[l<=i<=r&&prei<l],
	对(prei,ai，i)排序，那么询问区间变为一段前缀，
	用主席树维护排序后的数组，在j位置，在i插入ai，
	回答变为第j棵线段树的[l,r]区间的乘积。

*/

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[566];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i]){v[i]=i;prime.pb(i);}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)break;
			v[i*p]=p;
		}
	}
}

struct Seg
{
	int w[100066<<2][100];
	int PCNT=96;

	void update(int p,int l,int r,int aim,int*val)
	{
		if(l==r)
		{
			for(int i=0;i<PCNT;i++)
				w[p][i]=val[i];
			return ;
		}
		int mid=(l+r)>>1;
		if(aim<=mid)update(p<<1,l,mid,aim,val);
		else update(p<<1|1,mid+1,r,aim,val);
		for(int i=0;i<PCNT;i++)
			w[p][i]=max(w[p<<1][i],w[p<<1|1][i]);
	}

	void query(int p,int l,int r,int ql,int qr,int*ret)
	{
		if(ql<=l&&r<=qr)
		{
			for(int i=0;i<PCNT;i++)
				ret[i]=max(ret[i],w[p][i]);
			return;
		}
		int mid=(l+r)>>1;
		if(ql<=mid)query(p<<1,l,mid,ql,qr,ret);
		if(mid<qr)query(p<<1|1,mid+1,r,ql,qr,ret);
	}
}seg;

struct Chair
{
	int rt[100066<<5];
	int w[100066<<5],ls[100066<<5],rs[100066<<5];
	int tot;

	void build(int&p,int l,int r)
	{
		p=++tot;
		w[p]=1;
		if(l==r)return;
		int mid=(l+r)>>1;
		build(ls[p],l,mid);
		build(rs[p],mid+1,r);
	}

	void update(int p,int&q,int l,int r,int aim,int val)
	{
		q=++tot;
		w[q]=1ll*w[p]*val%mod;ls[q]=ls[p];rs[q]=rs[p];
		if(l==r)return;
		int mid=(l+r)>>1;
		if(aim<=mid)update(ls[p],ls[q],l,mid,aim,val);///////
		else update(rs[p],rs[q],mid+1,r,aim,val);
	}

	int query(int p,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)return w[p];
		int mid=(l+r)>>1,ret=1;
		if(ql<=mid)ret=query(ls[p],l,mid,ql,qr);
		if(mid<qr)ret=1ll*ret*query(rs[p],mid+1,r,ql,qr)%mod;
		return ret;
	}
}chair;

struct Node
{
	int id,pre,w;
	bool operator<(const Node&a)const
	{
		if(pre!=a.pre)return pre<a.pre;
		if(id!=a.id)return id<a.id;
		return w<a.w;
	}
}node[100066];

int n,a[100066];
int cnt[100],pre[200066];

void seperate(int&x)
{
	for(int i=0;i<SZ(prime);i++)
	{
		int p=prime[i];
		if(x%p)continue;
		while(x%p==0)x/=p,cnt[i]++;
		//printf("%d ",p);
	}//puts("");
}

int main()
{
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		memset(cnt,0,sizeof(cnt));
		seperate(a[i]);
		seg.update(1,1,n,i,cnt);
		node[i]=Node{i,pre[a[i]],a[i]};
		pre[a[i]]=i;
		//printf("%d \n",a[i]);
	}
	sort(node+1,node+n+1);
	chair.build(chair.rt[0],1,n);
	for(int i=1;i<=n;i++)
	{
		chair.update(chair.rt[i-1],chair.rt[i],1,n,node[i].id,node[i].w);
		//printf("__%d %d\n",node[i].w,node[i].id);
	}//puts("__");
	int _,last=0;
	scanf("%d",&_);
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		memset(cnt,0,sizeof(cnt));
		seg.query(1,1,n,l,r,cnt);
		int ans=1;
		for(int i=0;i<seg.PCNT;i++)
			ans=1ll*ans*powmod(prime[i],cnt[i])%mod;
	//	printf("%d\n",ans);
		int p=lower_bound(node+1,node+n+1,Node{0,l,0})-node-1;
	//	printf("___%d\n",p);
		ans=1ll*ans*chair.query(chair.rt[p],1,n,l,r)%mod;
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}
/*
3
2 3 5
1
1 3

5
5015 3009 1003 1007 19999
1
1 2

3
5015 3009 1003

*/


/*
	数的范围设为[1,MAX];
	一个数可以分解成若干个小于根号MAX 和 至多一个大于根号MAX的数相乘。
	小于的部分对每个数用线段树分别维护；
	大于的部分记为ai,对每个位置维护prei表示左边最近的相同值，
	那么对于查询[l,r]，等价于求Πai[l<=i<=r&&prei<l],
	对(prei,ai，i)排序，那么询问区间变为一段前缀，
	用主席树维护排序后的数组，在j位置，在i插入ai，
	回答变为第j棵线段树的[l,r]区间的乘积。

*/

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[566];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i]){v[i]=i;prime.pb(i);}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)break;
			v[i*p]=p;
		}
	}
}

struct Seg
{
	int w[10066<<2][100];
	int PCNT=96;

	void update(int p,int l,int r,int aim,int*val)
	{
		if(l==r)
		{
			for(int i=0;i<PCNT;i++)
				w[p][i]=val[i];
			return ;
		}
		int mid=(l+r)>>1;
		if(aim<=mid)update(p<<1,l,mid,aim,val);
		else update(p<<1|1,mid+1,r,aim,val);
		for(int i=0;i<PCNT;i++)
			w[p][i]=max(w[p<<1][i],w[p<<1|1][i]);
	}

	void query(int p,int l,int r,int ql,int qr,int*ret)
	{
		if(ql<=l&&r<=qr)
		{
			for(int i=0;i<PCNT;i++)
				ret[i]=max(ret[i],w[p][i]);
			return;
		}
		int mid=(l+r)>>1;
		if(ql<=mid)query(p<<1,l,mid,ql,qr,ret);
		if(mid<qr)query(p<<1|1,mid+1,r,ql,qr,ret);
	}
}seg;

struct Chair
{
	int rt[100066<<4];
	int w[100066<<4],ls[100066<<4],rs[100066<<4];
	int tot;

	void build(int&p,int l,int r)
	{
		p=++tot;
		w[p]=1;
		if(l==r)return;
		int mid=(l+r)>>1;
		build(ls[p],l,mid);
		build(rs[p],mid+1,r);
	}

	void update(int p,int&q,int l,int r,int aim,int val)
	{
		q=++tot;
		w[q]=1ll*w[p]*val%mod;ls[q]=ls[p];rs[q]=rs[p];
		if(l==r)return;
		int mid=(l+r)>>1;
		if(mid<=aim)update(ls[p],ls[q],l,mid,aim,val);
		else update(rs[p],rs[q],mid+1,r,aim,val);
	}

	int query(int p,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)return w[p];
		int mid=(l+r)>>1,ret=1;
		if(ql<=mid)ret=query(ls[p],l,mid,ql,qr);
		if(mid<qr)ret=1ll*ret*query(rs[p],mid+1,r,ql,qr)%mod;
		return ret;
	}
}chair;

struct Node
{
	int id,pre,w;
	bool operator<(const Node&a)const
	{
		if(pre!=a.pre)return pre<a.pre;
	}
}node[100066];

int n,a[100066];
int cnt[100],pre[200066];

void seperate(int&x)
{
	for(int i=0;i<SZ(prime);i++)
	{
		int p=prime[i];
		if(x%p)continue;
		while(x%p==0)x/=p,cnt[i]++;
	}
}

int main()
{
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		memset(cnt,0,sizeof(cnt));
		seperate(a[i]);
		seg.update(1,1,n,i,cnt);
		node[i]=Node{i,pre[a[i]],a[i]};
		pre[a[i]]=i;
	}
	sort(node+1,node+n+1);
	chair.build(chair.rt[0],1,n);
	for(int i=1;i<=n;i++)
	{
		chair.update(chair.rt[i-1],chair.rt[i],1,n,node[i].id,node[i].w);
		//printf("%d ",node[i].w);
	}//puts("__");
	int _,last=0;
	scanf("%d",&_);
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		memset(cnt,0,sizeof(cnt));
		seg.query(1,1,n,l,r,cnt);
		int ans=1;
		for(int i=0;i<seg.PCNT;i++)
			ans=1ll*ans*powmod(prime[i],cnt[i])%mod;
		//printf("%d\n",ans);
		int p=lower_bound(node+1,node+n+1,Node{0,l,0})-node-1;
		ans=1ll*ans*chair.query(chair.rt[p],1,n,l,r)%mod;
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}
/*
3
2 3 5
1
1 3

*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

int n,a[100066];
map<int,int>Map[100066<<2];
set<int>Set[100066<<2];
int w[100066<<2];

map<int,int> operator+(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=max(ret[p.fi],p.se);
		else ret[p.fi]=p.se;
	}return ret;
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		for(int i=2;i*i<=a[l];i++)
		{
			if(a[l]%i)continue;
			int cnt=0;
			while(a[l]%i==0)a[l]/=i,cnt++;
			Map[p][i]=cnt;
		}
		//if(a[l])Map[p][a[l]]=1;
		if(a[l]>1)Set[p].insert(a[l]);
		w[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	Map[p]=Map[p<<1]+Map[p<<1|1];
	w[p]=1ll*w[p<<1]*w[p<<1|1];
	for(auto x:Set[p<<1])
	{
		Set[p].insert(x);
		if(Set[p<<1|1].find(x)!=Set[p<<1|1].end())
			w[p]=1ll*w[p]*powmod(x,mod-2);
	}
	for(auto x:Set[p<<1|1])
		Set[p].insert(x);
}

int ans;
map<int,int>g,gg;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		ans=1ll*ans*w[p]%mod;
		if(l==ql)
		{
			g=Map[p];
		}
		else
		{
			g=g+Map[p];
		}

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g.clear();gg.clear();
		query(1,1,n,l,r);
		//printf("%d __\n",ans);
		for(auto x:g)
		{
			//printf("%d %d\n",x.fi,x.se);
			ans=1ll*ans*powmod(x.fi,x.se)%mod;
			//ans=1ll*ans*powmod(powmod(x.fi,x.se),mod-2)%mod;
		}

		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}

/*
4
2 3 4 6
1
4 3
*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[1000];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i])
		{
			v[i]=i;prime.pb(i);
		}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)continue;
			v[i*p]=p;
		}
	}
}

int n,a[100066];
map<int,int>Map[100066<<2];
set<int>Set[100066<<2];
int w[100066<<2];

map<int,int> operator+(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=max(ret[p.fi],p.se);
		else ret[p.fi]=p.se;
	}return ret;
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		for(auto i:prime)
		{
			if(a[l]%i)continue;
			int cnt=0;
			while(a[l]%i==0)a[l]/=i,cnt++;
			Map[p][i]=cnt;
		}
		//if(a[l])Map[p][a[l]]=1;
		if(a[l]>1)Set[p].insert(a[l]);
		w[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	Map[p]=Map[p<<1]+Map[p<<1|1];
	w[p]=1ll*w[p<<1]*w[p<<1|1];
	for(auto x:Set[p<<1])
	{
		Set[p].insert(x);
		if(Set[p<<1|1].find(x)!=Set[p<<1|1].end())
			w[p]=1ll*w[p]*powmod(x,mod-2);
	}
	for(auto x:Set[p<<1|1])
		Set[p].insert(x);
}

int ans;
map<int,int>g,gg;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		ans=1ll*ans*w[p]%mod;
		if(l==ql)
		{
			g=Map[p];
		}
		else
		{
			g=g+Map[p];
		}

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g.clear();gg.clear();
		query(1,1,n,l,r);
		//printf("%d __\n",ans);
		for(auto x:g)
		{
			//printf("%d %d\n",x.fi,x.se);
			ans=1ll*ans*powmod(x.fi,x.se)%mod;
			//ans=1ll*ans*powmod(powmod(x.fi,x.se),mod-2)%mod;
		}

		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}

/*
4
2 3 4 6
1
4 3
*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[1000];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i])
		{
			v[i]=i;prime.pb(i);
		}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)continue;
			v[i*p]=p;
		}
	}
}

int n,a[100066];
map<int,int>Map[100066<<2];
set<int>Set[100066<<2];
int w[100066<<2];

map<int,int> operator+(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=max(ret[p.fi],p.se);
		else ret[p.fi]=p.se;
	}return ret;
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		for(auto i:prime)
		{
			if(a[l]%i)continue;
			int cnt=0;
			while(a[l]%i==0)a[l]/=i,cnt++;
			Map[p][i]=cnt;
		}
		//if(a[l])Map[p][a[l]]=1;
		if(a[l]>1)Set[p].insert(a[l]);
		w[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	Map[p]=Map[p<<1]+Map[p<<1|1];
	w[p]=1ll*w[p<<1]*w[p<<1|1]%mod;
	for(auto x:Set[p<<1])
	{
		Set[p].insert(x);
		if(Set[p<<1|1].find(x)!=Set[p<<1|1].end())
			w[p]=1ll*w[p]*powmod(x,mod-2)%mod;
	}
	for(auto x:Set[p<<1|1])
		Set[p].insert(x);
}

int ans;
map<int,int>g,gg;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		ans=1ll*ans*w[p]%mod;
		if(l==ql)
		{
			g=Map[p];
		}
		else
		{
			g=g+Map[p];
		}

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	init();
//	for(int i=0;i<=10;i++)printf("%d ",prime[i]);puts("");
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g.clear();gg.clear();
		query(1,1,n,l,r);
		//printf("%d __\n",ans);
		for(auto x:g)
		{
			//printf("%d %d\n",x.fi,x.se);
			ans=1ll*ans*powmod(x.fi,x.se)%mod;
			//ans=1ll*ans*powmod(powmod(x.fi,x.se),mod-2)%mod;
		}

		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}

/*
4
2 3 4 6
1
4 3
*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

int n,a[100066];
int w[100066<<2],mul[100066<<2];

void build(int p,int l,int r)
{
	if(l==r)
	{
		w[p]=a[l];
		mul[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	w[p]=gcd(w[p<<1],w[p<<1|1]);
	mul[p]=1ll*mul[p<<1]*mul[p<<1|1]%mod;
}

int ans;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		int g=w[p];
		ans=1ll*ans*mul[p]%mod*powmod(g,mod-2)%mod;
		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;
		query(1,1,n,l,r);
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[1000];

#define int long long

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i])
		{
			v[i]=i;prime.pb(i);
		}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)continue;
			v[i*p]=p;
		}
	}
}

int n,a[100066];
map<int,int>Map[100066<<2];
set<int>Set[100066<<2];
int w[100066<<2];

map<int,int> operator+(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=max(ret[p.fi],p.se);
		else ret[p.fi]=p.se;
	}return ret;
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		for(auto i:prime)
		{
			if(a[l]%i)continue;
			int cnt=0;
			while(a[l]%i==0)a[l]/=i,cnt++;
			Map[p][i]=cnt;
		}
		//if(a[l])Map[p][a[l]]=1;
		if(a[l]>1)Set[p].insert(a[l]);
		w[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	Map[p]=Map[p<<1]+Map[p<<1|1];
	w[p]=1ll*w[p<<1]*w[p<<1|1]%mod;
	for(auto x:Set[p<<1])
	{
		Set[p].insert(x);
		if(Set[p<<1|1].find(x)!=Set[p<<1|1].end())
			w[p]=1ll*w[p]*powmod(x,mod-2)%mod;
	}
	for(auto x:Set[p<<1|1])
		Set[p].insert(x);
}

int ans;
map<int,int>g,gg;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		ans=1ll*ans*w[p]%mod;
		if(l==ql)
		{
			g=Map[p];
		}
		else
		{
			g=g+Map[p];
		}

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

signed main()
{
	init();
//	for(int i=0;i<=10;i++)printf("%d ",prime[i]);puts("");
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%lld",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%lld%lld",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g.clear();gg.clear();
		query(1,1,n,l,r);
		//printf("%d __\n",ans);
		for(auto x:g)
		{
			//printf("%d %d\n",x.fi,x.se);
			ans=1ll*ans*powmod(x.fi,x.se)%mod;
			//ans=1ll*ans*powmod(powmod(x.fi,x.se),mod-2)%mod;
		}

		printf("%lld\n",ans);
		last=ans;
	}
	return 0;
}

/*
4
1007 19999 2014 51
1
4 3
*/


/*
	数的范围设为[1,MAX];
	一个数可以分解成若干个小于根号MAX 和 至多一个大于根号MAX的数相乘。
	小于的部分对每个数用线段树分别维护；
	大于的部分记为ai,对每个位置维护prei表示左边最近的相同值，
	那么对于查询[l,r]，等价于求Πai[l<=i<=r&&prei<l],
	对(prei,ai，i)排序，那么询问区间变为一段前缀，
	用主席树维护排序后的数组，在j位置，在i插入ai，
	回答变为第j棵线段树的[l,r]区间的乘积。

*/

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[566];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i]){v[i]=i;prime.pb(i);}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)break;
			v[i*p]=p;
		}
	}
}

struct Seg
{
	int w[100066<<2][100];
	int PCNT=96;

	void update(int p,int l,int r,int aim,int*val)
	{
		if(l==r)
		{
			for(int i=0;i<PCNT;i++)
				w[p][i]=val[i];
			return ;
		}
		int mid=(l+r)>>1;
		if(aim<=mid)update(p<<1,l,mid,aim,val);
		else update(p<<1|1,mid+1,r,aim,val);
		for(int i=0;i<PCNT;i++)
			w[p][i]=max(w[p<<1][i],w[p<<1|1][i]);
	}

	void query(int p,int l,int r,int ql,int qr,int*ret)
	{
		if(ql<=l&&r<=qr)
		{
			for(int i=0;i<PCNT;i++)
				ret[i]=max(ret[i],w[p][i]);
			return;
		}
		int mid=(l+r)>>1;
		if(ql<=mid)query(p<<1,l,mid,ql,qr,ret);
		if(mid<qr)query(p<<1|1,mid+1,r,ql,qr,ret);
	}
}seg;

struct Chair
{
	int rt[100066<<4];
	int w[100066<<4],ls[100066<<4],rs[100066<<4];
	int tot;

	void build(int&p,int l,int r)
	{
		p=++tot;
		w[p]=1;
		if(l==r)return;
		int mid=(l+r)>>1;
		build(ls[p],l,mid);
		build(rs[p],mid+1,r);
	}

	void update(int p,int&q,int l,int r,int aim,int val)
	{
		q=++tot;
		w[q]=1ll*w[p]*val%mod;ls[q]=ls[p];rs[q]=rs[p];
		if(l==r)return;
		int mid=(l+r)>>1;
		if(mid<=aim)update(ls[p],ls[q],l,mid,aim,val);
		else update(rs[p],rs[q],mid+1,r,aim,val);
	}

	int query(int p,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)return w[p];
		int mid=(l+r)>>1,ret=1;
		if(ql<=mid)ret=query(ls[p],l,mid,ql,qr);
		if(mid<qr)ret=1ll*ret*query(rs[p],mid+1,r,ql,qr)%mod;
		return ret;
	}
}chair;

struct Node
{
	int id,pre,w;
	bool operator<(const Node&a)const
	{
		if(pre!=a.pre)return pre<a.pre;
	}
}node[100066];

int n,a[100066];
int cnt[100],pre[200066];

void seperate(int&x)
{
	for(int i=0;i<SZ(prime);i++)
	{
		int p=prime[i];
		if(x%p)continue;
		while(x%p==0)x/=p,cnt[i]++;
	}
}

int main()
{
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		memset(cnt,0,sizeof(cnt));
		seperate(a[i]);
		seg.update(1,1,n,i,cnt);
		node[i]=Node{i,pre[a[i]],a[i]};
		pre[a[i]]=i;
	}
	sort(node+1,node+n+1);
	chair.build(chair.rt[0],1,n);
	for(int i=1;i<=n;i++)
	{
		chair.update(chair.rt[i-1],chair.rt[i],1,n,node[i].id,node[i].w);
		//printf("%d ",node[i].w);
	}//puts("__");
	int _,last=0;
	scanf("%d",&_);
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		memset(cnt,0,sizeof(cnt));
		seg.query(1,1,n,l,r,cnt);
		int ans=1;
		for(int i=0;i<seg.PCNT;i++)
			ans=1ll*ans*powmod(prime[i],cnt[i])%mod;
		//printf("%d\n",ans);
		int p=lower_bound(node+1,node+n+1,Node{0,l,0})-node-1;
		ans=1ll*ans*chair.query(chair.rt[p],1,n,l,r)%mod;
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}
/*
3
2 3 5
1
1 3

*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

int n,a[100066];
map<int,int>Map[100066<<2];

map<int,int> operator+(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=max(ret[p.fi],p.se);
		else ret[p.fi]=p.se;
	}return ret;
}

void build(int p,int l,int r)
{
	if(l==r)
	{

		for(int i=2;i*i<=a[l];i++)
		{
			if(a[l]%i)continue;
			int cnt=0;
			while(a[l]%i==0)a[l]/=i,cnt++;
			Map[p][i]=cnt;
		}
		if(a[l])Map[p][a[l]]=1;

		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	Map[p]=Map[p<<1]+Map[p<<1|1];

}

int ans;
map<int,int>g,gg;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		if(l==ql)
		{
			g=Map[p];
		}
		else
		{
			g=g+Map[p];
		}

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g.clear();gg.clear();
		query(1,1,n,l,r);
		//printf("%d __\n",ans);
		for(auto x:g)
		{
			//printf("%d %d\n",x.fi,x.se);
			ans=1ll*ans*powmod(x.fi,x.se)%mod;
			//ans=1ll*ans*powmod(powmod(x.fi,x.se),mod-2)%mod;
		}

		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}

/*
4
2 3 4 6
1
4 3
*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

int n,a[100066];
int w[100066<<2],mul[100066<<2];

void build(int p,int l,int r)
{
	if(l==r)
	{
		w[p]=a[l];
		mul[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	w[p]=gcd(w[p<<1],w[p<<1|1]);
	mul[p]=1ll*mul[p<<1]*mul[p<<1|1]%mod;
}

int ans;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		int g=gcd(ans,mul[p]);
		ans=1ll*ans*mul[p]%mod*powmod(g,mod-2)%mod;
		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;
		query(1,1,n,l,r);
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}


/*
	数的范围设为[1,MAX];
	一个数可以分解成若干个小于根号MAX 和 至多一个大于根号MAX的数相乘。
	小于的部分对每个数用线段树分别维护；
	大于的部分记为ai,对每个位置维护prei表示左边最近的相同值，
	那么对于查询[l,r]，等价于求Πai[l<=i<=r&&prei<l],
	对(prei,ai，i)排序，那么询问区间变为一段前缀，
	用主席树维护排序后的数组，在j位置，在i插入ai，
	回答变为第j棵线段树的[l,r]区间的乘积。

*/

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

VI prime;
int v[566];

void init()
{
	int N=500;
	for(int i=2;i<=N;i++)
	{
		if(!v[i]){v[i]=i;prime.pb(i);}
		for(auto p:prime)
		{
			if(p>v[i]||p*i>N)break;
			v[i*p]=p;
		}
	}
}

struct Seg
{
	int w[100066<<2][100];
	int PCNT=96;

	void update(int p,int l,int r,int aim,int*val)
	{
		if(l==r)
		{
			for(int i=0;i<PCNT;i++)
				w[p][i]=val[i];
			return ;
		}
		int mid=(l+r)>>1;
		if(aim<=mid)update(p<<1,l,mid,aim,val);
		else update(p<<1|1,mid+1,r,aim,val);
		for(int i=0;i<PCNT;i++)
			w[p][i]=max(w[p<<1][i],w[p<<1|1][i]);
	}

	void query(int p,int l,int r,int ql,int qr,int*ret)
	{
		if(ql<=l&&r<=qr)
		{
			for(int i=0;i<PCNT;i++)
				ret[i]=max(ret[i],w[p][i]);
			return;
		}
		int mid=(l+r)>>1;
		if(ql<=mid)query(p<<1,l,mid,ql,qr,ret);
		if(mid<qr)query(p<<1|1,mid+1,r,ql,qr,ret);
	}
}seg;

struct Chair
{
	int rt[100066<<4];
	int w[100066<<4],ls[100066<<4],rs[100066<<4];
	int tot;

	void build(int&p,int l,int r)
	{
		p=++tot;
		w[p]=1;
		if(l==r)return;
		int mid=(l+r)>>1;
		build(ls[p],l,mid);
		build(rs[p],mid+1,r);
	}

	void update(int p,int&q,int l,int r,int aim,int val)
	{
		q=++tot;
		w[q]=1ll*w[p]*val%mod;ls[q]=ls[p];rs[q]=rs[p];
		if(l==r)return;
		int mid=(l+r)>>1;
		if(mid<=aim)update(ls[p],ls[q],l,mid,aim,val);
		else update(rs[p],rs[q],mid+1,r,aim,val);
	}

	int query(int p,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)return w[p];
		int mid=(l+r)>>1,ret=1;
		if(ql<=mid)ret=query(ls[p],l,mid,ql,qr);
		if(mid<qr)ret=1ll*ret*query(rs[p],mid+1,r,ql,qr)%mod;
		return ret;
	}
}chair;

struct Node
{
	int id,pre,w;
	bool operator<(const Node&a)const
	{
		if(pre!=a.pre)return pre<a.pre;
		if(id!=a.id)return id<a.id;
		return w<a.w;
	}
}node[100066];

int n,a[100066];
int cnt[100],pre[200066];

void seperate(int&x)
{
	for(int i=0;i<SZ(prime);i++)
	{
		int p=prime[i];
		if(x%p)continue;
		while(x%p==0)x/=p,cnt[i]++;
	}
}

int main()
{
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		memset(cnt,0,sizeof(cnt));
		seperate(a[i]);
		seg.update(1,1,n,i,cnt);
		node[i]=Node{i,pre[a[i]],a[i]};
		pre[a[i]]=i;
	}
	sort(node+1,node+n+1);
	chair.build(chair.rt[0],1,n);
	for(int i=1;i<=n;i++)
	{
		chair.update(chair.rt[i-1],chair.rt[i],1,n,node[i].id,node[i].w);
		//printf("%d ",node[i].w);
	}//puts("__");
	int _,last=0;
	scanf("%d",&_);
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		memset(cnt,0,sizeof(cnt));
		seg.query(1,1,n,l,r,cnt);
		int ans=1;
		for(int i=0;i<seg.PCNT;i++)
			ans=1ll*ans*powmod(prime[i],cnt[i])%mod;
		//printf("%d\n",ans);
		int p=lower_bound(node+1,node+n+1,Node{0,l,0})-node-1;
		ans=1ll*ans*chair.query(chair.rt[p],1,n,l,r)%mod;
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}
/*
3
2 3 5
1
1 3

*/


#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef double db;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const ll mod=1000000007;
//mt19937_64 mrand(random_device{}());
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

int n,a[100066];
int mul[100066<<2];
map<int,int>Map[100066<<2];

map<int,int> operator+(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=max(ret[p.fi],p.se);
		else ret[p.fi]=p.se;
	}return ret;
}

map<int,int> operator*(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)ret[p.fi]=p.se;
	for(auto p:b)
	{
		if(ret.count(p.fi))ret[p.fi]=ret[p.fi]+p.se;
		else ret[p.fi]=p.se;
	}return ret;
}

map<int,int> operator-(map<int,int> a,map<int,int>b)
{
	map<int,int>ret;
	ret.clear();
	for(auto p:a)
	{
		if(!b.count(p.fi))continue;
		ret[p.fi]=min(p.se,b[p.fi]);
	}return ret;
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		mul[p]=a[l];
		for(int i=2;i*i<=a[l];i++)
		{
			if(a[l]%i)continue;
			int cnt=0;
			while(a[l]%i==0)a[l]/=i,cnt++;
			Map[p][i]=cnt;
		}
		if(a[l])Map[p][a[l]]=1;

		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	Map[p]=Map[p<<1]+Map[p<<1|1];
	mul[p]=1ll*mul[p<<1]*mul[p<<1|1]%mod;
}

int ans;
map<int,int>g,gg;

void query(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		if(l==ql)
		{
			g=Map[p];
		}
		else
		{

			gg=gg*(g-Map[p]);
			g=g+Map[p];
		}
		ans=1ll*ans*mul[p]%mod;

		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid)query(p<<1,l,mid,ql,qr);
	if(mid<qr)query(p<<1|1,mid+1,r,ql,qr);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int _;
	scanf("%d",&_);
	int last=0;
	while(_--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+last)%n+1,r=(r+last)%n+1;
		if(l>r)swap(l,r);
		ans=1;g.clear();gg.clear();
		query(1,1,n,l,r);
		for(auto x:gg)
		{
			ans=1ll*ans*powmod(powmod(x.fi,x.se),mod-2)%mod;
		}
		printf("%d\n",ans);
		last=ans;
	}
	return 0;
}

/*
4
2 3 4 6
1
1 4
*/


#include<stack>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
const int mod=1e9+7;
struct trnode{
	int lc,rc,c;
	trnode() {c=1;}
}tr[20000000];
int tot=0,n,a[200010];
int pow(int a,int b)
{
	int ans=1;
	while(b)
	{
		if(b&1) ans=(LL)ans*a%mod;
		a=(LL)a*a%mod;b>>=1;
	}
	return ans;
}
void change(int &x,int l,int r,int fl,int fr,int c)
{
	if(!x) x=++tot;
	if(l==fl&&r==fr) {tr[x].c=(LL)tr[x].c*c%mod;return;}
	int mid=(l+r)/2;
	if(fr<=mid) change(tr[x].lc,l,mid,fl,fr,c);
	else if(fl>mid) change(tr[x].rc,mid+1,r,fl,fr,c);
	else change(tr[x].lc,l,mid,fl,mid,c),change(tr[x].rc,mid+1,r,mid+1,fr,c);
}
int merge(int x1,int x2,int l,int r)
{
	if(!x1||!x2) return x1+x2;
	int x=++tot;tr[x]=tr[x1];
	tr[x].c=(LL)tr[x1].c*tr[x2].c%mod;
	if(l!=r)
	{
		int mid=(l+r)/2;
		tr[x].lc=merge(tr[x1].lc,tr[x2].lc,l,mid);
		tr[x].rc=merge(tr[x1].rc,tr[x2].rc,mid+1,r);
	}
	return x;
}
int findans(int x,int l,int r,int fl,int fr)
{
	if(!x) return 1;
	if(l==fr&&r==fr) return tr[x].c;
	int mid=(l+r)/2;
	if(fr<=mid) return (LL)tr[x].c*findans(tr[x].lc,l,mid,fl,fr)%mod;
	if(fl>mid) return (LL)tr[x].c*findans(tr[x].rc,mid+1,r,fl,fr)%mod;
	return (LL)tr[x].c*findans(tr[x].lc,l,mid,fl,mid)%mod*findans(tr[x].rc,mid+1,r,mid+1,fr)%mod;
}
bool v[200010];
int prime[200010],pr=0,b[200010];
void pre()
{
	memset(v,true,sizeof(v));b[1]=1;
    for(int i=2;i<=200000;i++)
    {
        if(v[i]) prime[++pr]=i,b[i]=i;
        for(int j=1;j<=pr&&i*prime[j]<=200000;j++)
        {
            v[i*prime[j]]=false;
            if(i%prime[j]==0) {b[i*prime[j]]=prime[j];break;}
            b[i*prime[j]]=prime[j];
        }
    }
}
int ans[200010],rt[200010];
struct node{
	int l,x,c;
	node() {}
	node(int A,int B,int C) {l=A;x=B;c=C;}
}s[50];int top;
stack<node> t[200010];
void solve(int x,int now)
{
	//printf("solve:%d\n",now);
	top=0;
	while(x!=1)
	{
		s[++top].c=1;s[top].x=b[x];x/=b[x];
		while(b[x]==s[top].x) s[top].c++,x/=b[x];
	}
	for(int i=1;i<=top;i++)
	{
		x=s[i].x;int c=s[i].c;
		while(!t[x].empty())
		{
			node k=t[x].top();
			if(k.c>c) break;
			change(rt[now],1,n,k.l,k.x,pow(pow(x,k.c),mod-2));
			t[x].pop();
		}
		//if(now==4) printf("f**k %d %d\n",findans(rt[now],1,n,4,4),t[x].empty());
		if(t[x].empty()) change(rt[now],1,n,1,now,pow(x,c)),t[x].push(node(1,now,c));
		else
		{
			node k=t[x].top();
			change(rt[now],1,n,k.x+1,now,pow(x,c));t[x].push(node(k.x+1,now,c));
		}
		//node k=t[x].top();
		//printf("for:%d %d %d %d %d\n",x,k.l,k.x,k.c,findans(rt[now],1,n,4,4));
	}
}
int main()
{
	pre();
	//for(int i=1;i<=10;i++) printf("%d ",b[i]);printf("\n");
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) solve(a[i],i);
	for(int i=2;i<=n;i++) rt[i]=merge(rt[i],rt[i-1],1,n);
	int ans=0,q;scanf("%d",&q);
	while(q--)
	{
		int x,y;scanf("%d %d",&x,&y);
		(x+=ans)%=n;x++;(y+=ans)%=n;y++;
		if(x>y) swap(x,y);
		//printf("find:%d %d\n",x,y);
		ans=findans(rt[y],1,n,x,x);
		printf("%d\n",ans);
	}
}


#include<stack>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
const int mod=1e9+7;
struct trnode{
	int lc,rc,c;
	trnode() {c=1;}
}tr[40000000];
int tot=0,n,a[200010];
int pow(int a,int b)
{
	int ans=1;
	while(b)
	{
		if(b&1) ans=(LL)ans*a%mod;
		a=(LL)a*a%mod;b>>=1;
	}
	return ans;
}
void change(int &x,int l,int r,int fl,int fr,int c)
{
	if(!x) x=++tot;
	if(l==fl&&r==fr) {tr[x].c=(LL)tr[x].c*c%mod;return;}
	int mid=(l+r)/2;
	if(fr<=mid) change(tr[x].lc,l,mid,fl,fr,c);
	else if(fl>mid) change(tr[x].rc,mid+1,r,fl,fr,c);
	else change(tr[x].lc,l,mid,fl,mid,c),change(tr[x].rc,mid+1,r,mid+1,fr,c);
}
int merge(int x1,int x2,int l,int r)
{
	if(!x1||!x2) return x1+x2;
	int x=++tot;tr[x]=tr[x1];
	if(l==r) tr[x].c=(LL)tr[x1].c*tr[x2].c%mod;
	else
	{
		int mid=(l+r)/2;
		tr[x].lc=merge(tr[x1].lc,tr[x2].lc,l,mid);
		tr[x].rc=merge(tr[x1].rc,tr[x2].rc,mid+1,r);
	}
	return x;
}
int findans(int x,int l,int r,int fl,int fr)
{
	if(!x) return 1;
	if(l==fr&&r==fr) return tr[x].c;
	int mid=(l+r)/2;
	if(fr<=mid) return (LL)tr[x].c*findans(tr[x].lc,l,mid,fl,fr)%mod;
	if(fl>mid) return (LL)tr[x].c*findans(tr[x].rc,l,mid,fl,fr)%mod;
	return (LL)tr[x].c*findans(tr[x].lc,l,mid,fl,mid)%mod*findans(tr[x].rc,mid+1,r,mid+1,fr)%mod;
}
bool v[200010];
int prime[200010],pr=0,b[200010];
void pre()
{
	memset(v,true,sizeof(v));b[1]=1;
    for(int i=2;i<=200000;i++)
    {
        if(v[i]) prime[++pr]=i,b[i]=i;
        for(int j=1;j<=pr&&i*prime[j]<=200000;j++)
        {
            v[i*prime[j]]=false;
            if(i%prime[j]==0) {b[i*prime[j]]=prime[j];break;}
            b[i*prime[j]]=prime[j];
        }
    }
}
int ans[200010],rt[200010];
struct node{
	int l,x,c;
	node() {}
	node(int A,int B,int C) {l=A;x=B;c=C;}
}s[50];int top;
stack<node> t[200010];
void solve(int x,int now)
{
	//printf("solve:%d\n",now);
	top=0;
	while(x!=1)
	{
		s[++top].c=1;s[top].x=b[x];x/=b[x];
		while(b[x]==s[top].x) s[top].c++,x/=b[x];
	}
	for(int i=1;i<=top;i++)
	{
		x=s[i].x;int c=s[i].c;
		while(!t[x].empty())
		{
			node k=t[x].top();
			if(k.c>c) break;
			change(rt[now],1,n,k.l,k.x,pow(pow(x,k.c),mod-2));
			t[x].pop();
		}
		if(t[x].empty()) change(rt[now],1,n,1,now,pow(x,c)),t[x].push(node(1,now,c));
		else
		{
			node k=t[x].top();
			change(rt[now],1,n,k.x+1,now,pow(x,c));t[x].push(node(k.x+1,now,c));
		}
	}
}
int main()
{
	pre();
	//for(int i=1;i<=10;i++) printf("%d ",b[i]);printf("\n");
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) solve(a[i],i);
	for(int i=2;i<=n;i++) rt[i]=merge(rt[i],rt[i-1],1,n);
	int ans=0,q;scanf("%d",&q);
	while(q--)
	{
		int x,y;scanf("%d %d",&x,&y);
		(x+=ans)%=n;x++;(y+=ans)%=n;y++;
		if(x>y) swap(x,y);
		ans=findans(rt[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include<stack>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
const int mod=1e9+7;
struct trnode{
	int lc,rc,c;
	trnode() {c=1;}
}tr[20000000];
int tot=0,n,a[200010];
int pow(int a,int b)
{
	int ans=1;
	while(b)
	{
		if(b&1) ans=(LL)ans*a%mod;
		a=(LL)a*a%mod;b>>=1;
	}
	return ans;
}
void change(int &x,int l,int r,int fl,int fr,int c)
{
	if(!x) x=++tot;
	if(l==fl&&r==fr) {tr[x].c=(LL)tr[x].c*c%mod;return;}
	int mid=(l+r)/2;
	if(fr<=mid) change(tr[x].lc,l,mid,fl,fr,c);
	else if(fl>mid) change(tr[x].rc,mid+1,r,fl,fr,c);
	else change(tr[x].lc,l,mid,fl,mid,c),change(tr[x].rc,mid+1,r,mid+1,fr,c);
}
int merge(int x1,int x2,int l,int r)
{
	if(!x1||!x2) return x1+x2;
	int x=++tot;tr[x]=tr[x1];
	if(l==r) tr[x].c=(LL)tr[x1].c*tr[x2].c%mod;
	else
	{
		int mid=(l+r)/2;
		tr[x].lc=merge(tr[x1].lc,tr[x2].lc,l,mid);
		tr[x].rc=merge(tr[x1].rc,tr[x2].rc,mid+1,r);
	}
	return x;
}
int findans(int x,int l,int r,int fl,int fr)
{
	if(!x) return 1;
	if(l==fr&&r==fr) return tr[x].c;
	int mid=(l+r)/2;
	if(fr<=mid) return (LL)tr[x].c*findans(tr[x].lc,l,mid,fl,fr)%mod;
	if(fl>mid) return (LL)tr[x].c*findans(tr[x].rc,l,mid,fl,fr)%mod;
	return (LL)tr[x].c*findans(tr[x].lc,l,mid,fl,mid)%mod*findans(tr[x].rc,mid+1,r,mid+1,fr)%mod;
}
bool v[200010];
int prime[200010],pr=0,b[200010];
void pre()
{
	memset(v,true,sizeof(v));b[1]=1;
    for(int i=2;i<=200000;i++)
    {
        if(v[i]) prime[++pr]=i,b[i]=i;
        for(int j=1;j<=pr&&i*prime[j]<=200000;j++)
        {
            v[i*prime[j]]=false;
            if(i%prime[j]==0) {b[i*prime[j]]=prime[j];break;}
            b[i*prime[j]]=prime[j];
        }
    }
}
int ans[200010],rt[200010];
struct node{
	int l,x,c;
	node() {}
	node(int A,int B,int C) {l=A;x=B;c=C;}
}s[50];int top;
stack<node> t[200010];
void solve(int x,int now)
{
	//printf("solve:%d\n",now);
	top=0;
	while(x!=1)
	{
		s[++top].c=1;s[top].x=b[x];x/=b[x];
		while(b[x]==s[top].x) s[top].c++,x/=b[x];
	}
	for(int i=1;i<=top;i++)
	{
		x=s[i].x;int c=s[i].c;
		while(!t[x].empty())
		{
			node k=t[x].top();
			if(k.c>c) break;
			change(rt[now],1,n,k.l,k.x,pow(pow(x,k.c),mod-2));
			t[x].pop();
		}
		if(t[x].empty()) change(rt[now],1,n,1,now,pow(x,c)),t[x].push(node(1,now,c));
		else
		{
			node k=t[x].top();
			change(rt[now],1,n,k.x+1,now,pow(x,c));t[x].push(node(k.x+1,now,c));
		}
	}
}
int main()
{
	pre();
	//for(int i=1;i<=10;i++) printf("%d ",b[i]);printf("\n");
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) solve(a[i],i);
	for(int i=2;i<=n;i++) rt[i]=merge(rt[i],rt[i-1],1,n);
	int ans=0,q;scanf("%d",&q);
	while(q--)
	{
		int x,y;scanf("%d %d",&x,&y);
		(x+=ans)%=n;x++;(y+=ans)%=n;y++;
		if(x>y) swap(x,y);
		ans=findans(rt[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for (int i = (a), i##end = (b); i <= i##end; ++i)
#define per(i, a, b) for (int i = (a), i##end = (b); i >= i##end; --i)
mt19937 Rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
template<typename T>void chkmax(T&x,T y){if(x<y)x=y;}
template<typename T>void chkmin(T&x,T y){if(x>y)x=y;}
inline int read() {
  #define nc getchar()
  int x=0;char c=nc;
  while(c<48)c=nc;
  while(c>47)x=x*10+(c^48),c=nc;
  return x;
  #undef nc
}

typedef double db;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
const int maxn=1e5+10,P=1e9+7;
int n,q,A[maxn];
int len,lst[maxn*2],L[maxn],R[maxn];pii dat[maxn*4];

int tot,pri[maxn*2],ppw[10][30];

void sieve() {
  int N=2e5;
  rep(i,2,N)if(!pri[i]){
    pri[++tot]=i;
    for(int j=i+i;j<=N;j+=i)pri[j]=1;
  }
  rep(i,0,9){
    ppw[i][0]=1;
    rep(j,1,20){
      ppw[i][j]=pri[i+1]*ppw[i][j-1];
      if(ppw[i][j]>=maxn*2)break;
    }
  }
}

int qp(int a,int k){
  int res=1;
  for(;k;k>>=1,a=1ll*a*a%P)if(k&1)res=1ll*res*a%P;
  return res;
}

struct SGT{
  #define mid ((l+r)>>1)
  #define lson k<<1,l,mid
  #define rson k<<1|1,mid+1,r
  int val[maxn<<2];
  void build(int k,int l,int r,int ttt){
    if(l==r){
      int x=A[l];
      while(x%ttt==0)val[k]++,x/=ttt;return;
    }
    build(lson,ttt),build(rson,ttt),val[k]=max(val[k<<1],val[k<<1|1]);
  }
  int query(int k,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return val[k];int res=0;
    if(ql<=mid)res=query(lson,ql,qr);
    if(qr>mid)chkmax(res,query(rson,ql,qr));
    return res;
  }
  #undef mid
  #undef lson
  #undef rson
}TR[10];

#define mid ((l + r) >> 1)

int tn,rt[maxn*4],ls[maxn*80],rs[maxn*80],pro[maxn*80];
void ins(int &k,int rt,int l,int r,int x,int v){
  pro[k=++tn]=1ll*v*pro[rt]%P,ls[k]=ls[rt],rs[k]=rs[rt];
  if(l==r)return;
  x<=mid?ins(ls[k],ls[rt],l,mid,x,v):ins(rs[k],rs[rt],mid+1,r,x,v);
}
int query(int k,int l,int r,int x){
  if(r<=x)return pro[k];
  return x>mid?1ll*pro[ls[k]]*query(rs[k],mid+1,r,x)%P:query(ls[k],l,mid,x);
}

#undef mid

void solve() {
  sieve();
  cin>>n;
  rep(i,1,n){
    L[i]=len+1;
    int x=A[i]=read(),tmp=sqrt(x);
    for(int j=1;j<=tot&&pri[j]<=tmp;j++)if(x%pri[j]==0){
      int c=1;while(x%pri[j]==0)x/=pri[j],c*=pri[j];
      if(j>10)dat[++len]={pri[j],c};
    }
    if(x>pri[10])dat[++len]={x,x};
    R[i]=len;
  }
  fill(pro,pro+maxn*79,1);
  rep(i,1,n)rep(j,L[i],R[i]){
    int &p=lst[dat[j].second];
    ins(rt[j],rt[j-1],0,len,p,dat[j].first),p=j;
  }
  rep(i,0,9)TR[i].build(1,1,n,pri[i+1]);
  cin>>q;int lastans=0;
  while(q--){
    int l=(read()+lastans)%n+1,r=(read()+lastans)%n+1;
    if(l>r)swap(l,r);
    int ans=1;
    rep(i,0,9)ans=1ll*ans*ppw[i][TR[i].query(1,1,n,l,r)]%P;
    ans=1ll*ans*query(rt[R[r]],0,len,L[l]-1)%P*qp(query(rt[L[l]-1],0,len,L[l]-1),P-2)%P;
    printf("%d\n",lastans=ans);
  }
}

signed main() {
//  int T=read();
//  while(T--)solve();
  solve();
  return 0;
}


#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for (int i = (a), i##end = (b); i <= i##end; ++i)
#define per(i, a, b) for (int i = (a), i##end = (b); i >= i##end; --i)
mt19937 Rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
template<typename T>void chkmax(T&x,T y){if(x<y)x=y;}
template<typename T>void chkmin(T&x,T y){if(x>y)x=y;}
inline int read() {
  #define nc getchar()
  int x=0;char c=nc;
  while(c<48)c=nc;
  while(c>47)x=x*10+(c^48),c=nc;
  return x;
  #undef nc
}

typedef double db;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
const int maxn=1e5+10,P=1e9+7;
int n,q,A[maxn];
int len,lst[maxn*2],L[maxn],R[maxn];pii dat[maxn*4];

int tot,pri[maxn*2],ppw[10][30];

void sieve() {
  int N=2e5;
  rep(i,2,N)if(!pri[i]){
    pri[++tot]=i;
    for(int j=i+i;j<=N;j+=i)pri[j]=1;
  }
  rep(i,0,9){
    ppw[i][0]=1;
    rep(j,1,20){
      ppw[i][j]=pri[i+1]*ppw[i][j-1];
      if(ppw[i][j]>=maxn*2)break;
    }
  }
}

int qp(int a,int k){
  int res=1;
  for(;k;k>>=1,a=1ll*a*a%P)if(k&1)res=1ll*res*a%P;
  return res;
}

struct SGT{
  #define mid ((l+r)>>1)
  #define lson k<<1,l,mid
  #define rson k<<1|1,mid+1,r
  int val[maxn<<2];
  void build(int k,int l,int r,int ttt){
    if(l==r){
      int x=A[l];
      while(x%ttt==0)val[k]++,x/=ttt;return;
    }
    build(lson,ttt),build(rson,ttt),val[k]=max(val[k<<1],val[k<<1|1]);
  }
  int query(int k,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return val[k];int res=0;
    if(ql<=mid)res=query(lson,ql,qr);
    if(qr>mid)chkmax(res,query(rson,ql,qr));
    return res;
  }
  #undef mid
  #undef lson
  #undef rson
}TR[10];

#define mid ((l + r) >> 1)

int tn,rt[maxn*4],ls[maxn*80],rs[maxn*80],pro[maxn*80];
void ins(int &k,int rt,int l,int r,int x,int v){
  pro[k=++tn]=1ll*v*pro[rt]%P,ls[k]=ls[rt],rs[k]=rs[rt];
  if(l==r)return;
  x<=mid?ins(ls[k],ls[rt],l,mid,x,v):ins(rs[k],rs[rt],mid+1,r,x,v);
}
int query(int k,int l,int r,int x){
  if(r<=x)return pro[k];
  return x>mid?1ll*pro[ls[k]]*query(rs[k],mid+1,r,x)%P:query(ls[k],l,mid,x);
}

#undef mid

void solve() {
  sieve();
  cin>>n;
  rep(i,1,n){
    L[i]=len+1;
    int x=A[i]=read(),tmp=sqrt(x);
    for(int j=1;j<=tot&&pri[j]<=tmp;j++)if(x%pri[j]==0){
      int c=1;while(x%pri[j]==0){
        x/=pri[j],c*=pri[j];
        if(j>10)dat[++len]={pri[j],c};
      }
    }
    if(x>pri[10])dat[++len]={x,x};
    R[i]=len;
  }
  fill(pro,pro+maxn*79,1);
  rep(i,1,n)rep(j,L[i],R[i]){
    int &p=lst[dat[j].second];
    ins(rt[j],rt[j-1],0,len,p,dat[j].first),p=j;
  }
  rep(i,0,9)TR[i].build(1,1,n,pri[i+1]);
  cin>>q;int lastans=0;
  while(q--){
    int l=(read()+lastans)%n+1,r=(read()+lastans)%n+1;
    if(l>r)swap(l,r);
    int ans=1;
    rep(i,0,9)ans=1ll*ans*ppw[i][TR[i].query(1,1,n,l,r)]%P;
    ans=1ll*ans*query(rt[R[r]],0,len,L[l]-1)%P*qp(query(rt[L[l]-1],0,len,L[l]-1),P-2)%P;
    printf("%d\n",lastans=ans);
  }
}

signed main() {
//  int T=read();
//  while(T--)solve();
  solve();
  return 0;
}