#include <bits/stdc++.h>
#define int long long
#define float long double
#define PB push_back
#define MP make_pair
#define ss second
#define ff first
#define PI 3.14159265
#define MXX 9*(1e18)
#define fastrack ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;
const int M = 4*1e4, mod = 1e9 + 7;

signed main(){
    fastrack;
    int tt; cin >> tt; while(tt--)
    {
        int a, b;
        cin >> a >> b;
        if(__gcd(a, b) != 1)
            cout << "infinite" << "\n";
        else
            cout << "finite" << "\n";
    }
    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define float long double
#define PB push_back
#define MP make_pair
#define ss second
#define ff first
#define PI 3.14159265
#define MXX 9*(1e18)
#define fastrack ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;
const int M = 2*1e5 + 7, mod = 1e9 + 7;

signed main(){
    fastrack;
    int tt; cin >> tt; while(tt--)
    {
        int a, b;
        cin >> a >> b;
        int ar[M] = {};
        ar[0] = 1;
        bool ok = (a != b);
        for(int i = min(a, b); i <= (a, b); i++){
            if(ar[i - a] == 1)
                ar[i] = 1;
            else  if(ar[i - b] == 1)
                ar[i] = 1;
            else
                ok = 0;
        }
        if(ok)
            cout << "finite" << "\n";
        else
            cout << "infinite" << "\n";
    }
    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define float long double
#define PB push_back
#define MP make_pair
#define ss second
#define ff first
#define PI 3.14159265
#define MXX 9*(1e18)
#define fastrack ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;
const int M = 2*1e5 + 7, mod = 1e9 + 7;

signed main(){
    fastrack;
    int tt; cin >> tt; while(tt--)
    {
        int a, b;
        cin >> a >> b;
        int ar[max(a, b) + 1] = {};
        ar[0] = 1;
        bool ok = (a != b);
        for(int i = min(a, b); i <= (a, b); i++){
            if(ar[i - a] == 1)
                ar[i] = 1;
            else  if(ar[i - b] == 1)
                ar[i] = 1;
            else
                ok = 0;
        }
        if(ok)
            cout << "finite" << "\n";
        else
            cout << "infinite" << "\n";
    }
    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define float long double
#define PB push_back
#define MP make_pair
#define ss second
#define ff first
#define PI 3.14159265
#define MXX 9*(1e18)
#define fastrack ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;
const int M = 2*1e5 + 7, mod = 1e9 + 7;

signed main(){
    fastrack;
    int tt; cin >> tt; while(tt--)
    {
        int a, b;
        cin >> a >> b;
        int ar[max(a, b) + 1] = {};
        ar[0] = 1;
        bool ok = (a != b);
        for(int i = min(a, b); i <= max(a, b); i++){
            if(ar[i - a] == 1)
                ar[i] = 1;
            else  if(ar[i - b] == 1)
                ar[i] = 1;
            else
                ok = 0;
        }
        if(ok)
            cout << "finite" << "\n";
        else
            cout << "infinite" << "\n";
    }
    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define float long double
#define PB push_back
#define MP make_pair
#define ss second
#define ff first
#define PI 3.14159265
#define MXX 9*(1e18)
#define fastrack ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;
const int M = 4*1e4, mod = 1e9 + 7;

signed main(){
    fastrack;
    int tt; cin >> tt; while(tt--)
    {
        int p, q;
        cin >> p >> q;
        int a[M] = {};
        a[0] = 1;
        for(int i = 1; i < M; i++){
            if(i - p >= 0 && a[i - p] == 1){
                a[i] = 1;
            }
            if(i - q >= 0 && a[i - q] == 1){
                a[i] = 1;
            }
        }
        int ok = 0, num = 0;
        for(int i = 0; i < M; i++){
            if(a[i] == 1){
                num++;
                if(num >= min(p, q))
                    ok = 1;
            }
            else{
                if(num >= min(p, q))
                    ok = 1;
                num = 0;
            }
        }
        if(ok)
            cout << "finite" << "\n";
        else
            cout << "infinite" << "\n";
    }
    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define float long double
#define PB push_back
#define MP make_pair
#define ss second
#define ff first
#define PI 3.14159265
#define MXX 9*(1e18)
#define fastrack ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;
const int M = 4*1e4, mod = 1e9 + 7;

signed main(){
    fastrack;
    int tt; cin >> tt; while(tt--)
    {
        int p, q;
        cin >> p >> q;
        int a[M] = {};
        a[0] = 1;
        for(int i = 1; i < M; i++){
            if(i - p >= 0 && a[i - p] == 1){
                a[i] = 1;
            }
            if(i - q >= 0 && a[i - q] == 1){
                a[i] = 1;
            }
        }
        int ok = 0, num = 0;
        for(int i = 0; i < 15; i++){
            if(a[i] == 1){
                num++;
                if(num >= min(p, q))
                    ok = 1;
            }
            else{
                if(num >= min(p, q))
                    ok = 1;
                num = 0;
            }
        }
        if(ok)
            cout << "finite" << "\n";
        else
            cout << "infinite" << "\n";
    }
    return 0;
}


#include<bits/stdc++.h>
int gcd(int a,int b)
{

    if(b==0)
        return a;
    gcd(b,a%b);

}
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int a,b;
        cin >> a >> b;
        int m = gcd(a,b);

        if(m==1)
            cout << "Finite" << '\n';
        else
            cout << "Infinite" << '\n';
    }
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	long long l,r,s;
}t[20000001];
long long n,m,x,y,ans,root[200001],cnt,mod=1000000007ll;
vector<long long> p1[200001],p2[200001];
stack<long long> s1[200001],s2[200001];
long long ksm(long long a,long long b){
	long long s=1ll;
	while(b){
		if(b&1ll)s=(s*a)%mod;
		a=(a*a)%mod;
		b=b/2ll;
	}
	return s;
}
void build(long long &a,long long l,long long r){
	if(!a){
		cnt++;
		a=cnt;
	}
	if(l==r){
		t[a].s=1ll;
		return;
	}
	long long mid=(l+r)/2;
	build(t[a].l,l,mid);
	build(t[a].r,mid+1ll,r);
}
void turn(long long rt,long long &a,long long l,long long r,long long id,long long v){
	if(id>r||id<l)return;
	cnt++;
	a=cnt;
	t[a]=t[rt];
	t[a].s=(t[a].s*v)%mod;
	if(l==r)return;
	long long mid=(l+r)/2;
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1ll,r,id,v);
	t[a].s=(t[t[a].l].s*t[t[a].r].s)%mod;
}
long long find(long long a,long long l,long long r,long long ql,long long qr){
	if(ql>r||qr<l)return 1ll;
	if(ql<=l&&r<=qr)return t[a].s;
	long long mid=(l+r)/2;
	long long ans1=find(t[a].l,l,mid,ql,qr);
	long long ans2=find(t[a].r,mid+1ll,r,ql,qr);
	return (ans1*ans2)%mod;
}
int main(){
	scanf("%lld",&n);
	for(long long i=2ll;i<=200000ll;i++){
		for(long long j=i;j<=200000ll;j=j+i){
			long long w=j,s=0ll;
			while(w%i==0ll){
				w=w/i;
				s++;
			}
			p1[j].push_back(i);
			p2[j].push_back(s);
		}
	}
	build(root[0ll],1ll,n);
	for(long long i=1ll;i<=n;i++){
		scanf("%lld",&x);
		root[i]=root[i-1ll];
		for(long long j=0;j<p1[x].size();j++){
			long long u=p1[x][j];
			long long v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1ll,n,s1[u].top(),ksm(ksm(u,mod-2ll),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1ll,n,s1[u].top(),ksm(ksm(u,mod-2ll),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1ll,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
	}
	scanf("%lld",&m);
	for(long long i=1ll;i<=m;i++){
		scanf("%lld%lld",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1ll,n,x,y);
		printf("%lld\n",ans);
	}
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	int l,r,s,la;
}t[15000001];
int n,m,x,y,ans,root[200001],cnt,mod=1000000007;
vector<int> p1[200001],p2[200001];
stack<int> s1[200001],s2[200001];
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=((long long)s*(long long)a)%(long long)mod;
		a=((long long)a*(long long)a)%(long long)mod;
		b=b/2;
	}
	return s;
}
void down(int a){
	if(t[a].la){
		t[t[a].l].la=t[a].la;
		t[t[a].r].la=t[a].la;
	}
}
void turn(int rt,int &a,int l,int r,int id,int v){
	if(id>r||id<l)return;
	if(t[rt].la!=0){
		cnt++;
		a=cnt;
		t[a]=t[rt];
		t[a].la=0;
	}else a=rt;
	t[a].s=((long long)t[a].s*(long long)v)%(long long)mod;
	if(l==r)return;
	int mid=(l+r)/2;
	down(rt);
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1,r,id,v);
}
int find(int a,int l,int r,int ql,int qr){
	if(!a)return 1;
	if(ql>r||qr<l)return 1;
	if(ql<=l&&r<=qr)return t[a].s;
	int mid=(l+r)/2;
	int ans1=find(t[a].l,l,mid,ql,qr);
	int ans2=find(t[a].r,mid+1,r,ql,qr);
	return int(((long long)ans1*(long long)ans2)%(long long)mod);
}
int main(){
	scanf("%d",&n);
	t[0].s=1;
	t[0].la=1;
	for(int i=2;i<=200000;i++){
		if(p1[i].empty()){
			for(int j=i;j<=200000;j=j+i){
				int w=j,s=0;
				while(w%i==0){
					w=w/i;
					s++;
				}
				p1[j].push_back(i);
				p2[j].push_back(s);
			}
		}
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		root[i]=root[i-1];
		for(int j=0;j<p1[x].size();j++){
			int u=p1[x][j];
			int v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
		t[root[i]].la=i;
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	int l,r,s;
}t[30000001];
int n,m,x,y,ans,root[200001],cnt,mod=1000000007;
vector<int> p1[200001],p2[200001];
stack<int> s1[200001],s2[200001];
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=((long long)s*(long long)a)%(long long)mod;
		a=((long long)a*(long long)a)%(long long)mod;
		b=b/2;
	}
	return s;
}
void build(int &a,int l,int r){
	if(!a){
		cnt++;
		a=cnt;
	}
	t[a].s=1;
	if(l==r)return;
	int mid=(l+r)/2;
	build(t[a].l,l,mid);
	build(t[a].r,mid+1,r);
}
void turn(int rt,int &a,int l,int r,int id,int v){
	if(id>r||id<l)return;
	cnt++;
	a=cnt;
	t[a]=t[rt];
	t[a].s=((long long)t[a].s*(long long)v)%(long long)mod;
	if(l==r)return;
	int mid=(l+r)/2;
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1,r,id,v);
}
int find(int a,int l,int r,int ql,int qr){
	if(ql>r||qr<l)return 1;
	if(ql<=l&&r<=qr)return t[a].s;
	int mid=(l+r)/2;
	int ans1=find(t[a].l,l,mid,ql,qr);
	int ans2=find(t[a].r,mid+1,r,ql,qr);
	return int(((long long)ans1*(long long)ans2)%(long long)mod);
}
int main(){
	scanf("%d",&n);
	for(int i=2;i<=200000;i++){
		if(p1[i].empty()){
			for(int j=i;j<=200000;j=j+i){
				int w=j,s=0;
				while(w%i==0){
					w=w/i;
					s++;
				}
				p1[j].push_back(i);
				p2[j].push_back(s);
			}
		}
	}
	build(root[0],1,n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		root[i]=root[i-1];
		for(int j=0;j<p1[x].size();j++){
			int u=p1[x][j];
			int v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	int l,r,s;
}t[22000001];
int n,m,x,y,ans,root[200001],cnt,mod=1000000007;
vector<int> p1[200001],p2[200001];
stack<int> s1[200001],s2[200001];
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=((long long)s*(long long)a)%(long long)mod;
		a=((long long)a*(long long)a)%(long long)mod;
		b=b/2;
	}
	return s;
}
void build(int &a,int l,int r){
	if(!a){
		cnt++;
		a=cnt;
	}
	t[a].s=1;
	if(l==r)return;
	int mid=(l+r)/2;
	build(t[a].l,l,mid);
	build(t[a].r,mid+1,r);
}
void turn(int rt,int &a,int l,int r,int id,int v){
	if(id>r||id<l)return;
	cnt++;
	a=cnt;
	t[a]=t[rt];
	t[a].s=((long long)t[a].s*(long long)v)%(long long)mod;
	if(l==r)return;
	int mid=(l+r)/2;
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1,r,id,v);
}
int find(int a,int l,int r,int ql,int qr){
	if(ql>r||qr<l)return 1;
	if(ql<=l&&r<=qr)return t[a].s;
	int mid=(l+r)/2;
	int ans1=find(t[a].l,l,mid,ql,qr);
	int ans2=find(t[a].r,mid+1,r,ql,qr);
	return int(((long long)ans1*(long long)ans2)%(long long)mod);
}
int main(){
	scanf("%d",&n);
	for(int i=2;i<=200000;i++){
		if(p1[i].empty()){
			for(int j=i;j<=200000;j=j+i){
				int w=j,s=0;
				while(w%i==0){
					w=w/i;
					s++;
				}
				p1[j].push_back(i);
				p2[j].push_back(s);
			}
		}
	}
	build(root[0],1,n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		root[i]=root[i-1];
		for(int j=0;j<p1[x].size();j++){
			int u=p1[x][j];
			int v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	int l,r,s;
}t[20000001];
int n,m,x,y,ans,root[200001],cnt,mod=1000000007;
vector<int> p1[200001],p2[200001];
stack<int> s1[200001],s2[200001];
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=((long long)s*(long long)a)%(long long)mod;
		a=((long long)a*(long long)a)%(long long)mod;
		b=b/2;
	}
	return s;
}
void build(int &a,int l,int r){
	if(!a){
		cnt++;
		a=cnt;
	}
	if(l==r){
		t[a].s=1;
		return;
	}
	int mid=(l+r)/2;
	build(t[a].l,l,mid);
	build(t[a].r,mid+1,r);
}
void turn(int rt,int &a,int l,int r,int id,int v){
	if(id>r||id<l)return;
	cnt++;
	a=cnt;
	t[a]=t[rt];
	t[a].s=((long long)t[a].s*(long long)v)%(long long)mod;
	if(l==r)return;
	int mid=(l+r)/2;
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1,r,id,v);
	t[a].s=((long long)t[t[a].l].s*(long long)t[t[a].r].s)%mod;
}
int find(int a,int l,int r,int ql,int qr){
	if(ql>r||qr<l)return 1;
	if(ql<=l&&r<=qr)return t[a].s;
	int mid=(l+r)/2;
	int ans1=find(t[a].l,l,mid,ql,qr);
	int ans2=find(t[a].r,mid+1,r,ql,qr);
	return int(((long long)ans1*(long long)ans2)%(long long)mod);
}
int main(){
	scanf("%d",&n);
	for(int i=2;i<=200000;i++){
		if(p1[i].empty()){
			for(int j=i;j<=200000;j=j+i){
				int w=j,s=0;
				while(w%i==0){
					w=w/i;
					s++;
				}
				p1[j].push_back(i);
				p2[j].push_back(s);
			}
		}
	}
	build(root[0],1,n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		root[i]=root[i-1];
		for(int j=0;j<p1[x].size();j++){
			int u=p1[x][j];
			int v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	int l,r,s;
}t[23000001];
int n,m,x,y,ans,root[200001],cnt,mod=1000000007;
vector<int> p1[200001],p2[200001];
stack<int> s1[200001],s2[200001];
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=((long long)s*(long long)a)%(long long)mod;
		a=((long long)a*(long long)a)%(long long)mod;
		b=b/2;
	}
	return s;
}
void turn(int rt,int &a,int l,int r,int id,int v){
	if(id>r||id<l)return;
	cnt++;
	a=cnt;
	t[a]=t[rt];
	t[a].s=((long long)t[a].s*(long long)v)%(long long)mod;
	if(l==r)return;
	int mid=(l+r)/2;
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1,r,id,v);
}
int find(int a,int l,int r,int ql,int qr){
	if(!a)return 1;
	if(ql>r||qr<l)return 1;
	if(ql<=l&&r<=qr)return t[a].s;
	int mid=(l+r)/2;
	int ans1=find(t[a].l,l,mid,ql,qr);
	int ans2=find(t[a].r,mid+1,r,ql,qr);
	return int(((long long)ans1*(long long)ans2)%(long long)mod);
}
int main(){
	scanf("%d",&n);
	t[0].s=1;
	for(int i=2;i<=200000;i++){
		if(p1[i].empty()){
			for(int j=i;j<=200000;j=j+i){
				int w=j,s=0;
				while(w%i==0){
					w=w/i;
					s++;
				}
				p1[j].push_back(i);
				p2[j].push_back(s);
			}
		}
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		root[i]=root[i-1];
		for(int j=0;j<p1[x].size();j++){
			int u=p1[x][j];
			int v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	int l,r,s,la;
}t[15000001];
int n,m,x,y,ans,root[200001],cnt,mod=1000000007;
vector<int> p1[200001],p2[200001];
stack<int> s1[200001],s2[200001];
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=((long long)s*(long long)a)%(long long)mod;
		a=((long long)a*(long long)a)%(long long)mod;
		b=b/2;
	}
	return s;
}
void down(int a){
	if(t[a].la){
		t[t[a].l].la=t[a].la;
		t[t[a].r].la=t[a].la;
	}
}
void turn(int rt,int &a,int l,int r,int id,int v){
	if(id>r||id<l)return;
	if(t[rt].la!=0){
		cnt++;
		a=cnt;
		t[a]=t[rt];
		t[a].la=0;
	}else a=rt;
	t[a].s=((long long)t[a].s*(long long)v)%(long long)mod;
	if(l==r)return;
	int mid=(l+r)/2;
	down(a);
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1,r,id,v);
}
int find(int a,int l,int r,int ql,int qr){
	if(!a)return 1;
	if(ql>r||qr<l)return 1;
	if(ql<=l&&r<=qr)return t[a].s;
	int mid=(l+r)/2;
	int ans1=find(t[a].l,l,mid,ql,qr);
	int ans2=find(t[a].r,mid+1,r,ql,qr);
	return int(((long long)ans1*(long long)ans2)%(long long)mod);
}
int main(){
	scanf("%d",&n);
	t[0].s=1;
	t[0].la=1;
	for(int i=2;i<=200000;i++){
		if(p1[i].empty()){
			for(int j=i;j<=200000;j=j+i){
				int w=j,s=0;
				while(w%i==0){
					w=w/i;
					s++;
				}
				p1[j].push_back(i);
				p2[j].push_back(s);
			}
		}
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		root[i]=root[i-1];
		for(int j=0;j<p1[x].size();j++){
			int u=p1[x][j];
			int v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
		t[root[i]].la=i;
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
struct data{
	int l,r,s;
}t[20000001];
int n,m,x,y,ans,root[200001],cnt,mod=1000000007;
vector<int> p1[200001],p2[200001];
stack<int> s1[200001],s2[200001];
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=((long long)s*(long long)a)%(long long)mod;
		a=((long long)a*(long long)a)%(long long)mod;
		b=b/2;
	}
	return s;
}
void build(int &a,int l,int r){
	if(!a){
		cnt++;
		a=cnt;
	}
	t[a].s=1;
	if(l==r)return;
	int mid=(l+r)/2;
	build(t[a].l,l,mid);
	build(t[a].r,mid+1,r);
}
void turn(int rt,int &a,int l,int r,int id,int v){
	if(id>r||id<l)return;
	cnt++;
	a=cnt;
	t[a]=t[rt];
	t[a].s=((long long)t[a].s*(long long)v)%(long long)mod;
	if(l==r)return;
	int mid=(l+r)/2;
	turn(t[rt].l,t[a].l,l,mid,id,v);
	turn(t[rt].r,t[a].r,mid+1,r,id,v);
}
int find(int a,int l,int r,int ql,int qr){
	if(ql>r||qr<l)return 1;
	if(ql<=l&&r<=qr)return t[a].s;
	int mid=(l+r)/2;
	int ans1=find(t[a].l,l,mid,ql,qr);
	int ans2=find(t[a].r,mid+1,r,ql,qr);
	return int(((long long)ans1*(long long)ans2)%(long long)mod);
}
int main(){
	scanf("%d",&n);
	for(int i=2;i<=200000;i++){
		if(p1[i].empty()){
			for(int j=i;j<=200000;j=j+i){
				int w=j,s=0;
				while(w%i==0){
					w=w/i;
					s++;
				}
				p1[j].push_back(i);
				p2[j].push_back(s);
			}
		}
	}
	build(root[0],1,n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		root[i]=root[i-1];
		for(int j=0;j<p1[x].size();j++){
			int u=p1[x][j];
			int v=p2[x][j];
			while(!s1[u].empty()){
				if(s2[u].top()<=v){
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),s2[u].top()));
					v=v-s2[u].top();
					s1[u].pop();
					s2[u].pop();
				}else{
					turn(root[i],root[i],1,n,s1[u].top(),ksm(ksm(u,mod-2),v));
					s2[u].top()=s2[u].top()-v;
					break;
				}
			}
			v=p2[x][j];
			turn(root[i],root[i],1,n,i,ksm(u,v));
            s1[u].push(i);
            s2[u].push(v);
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		x=(x+ans)%n;
		y=(y+ans)%n;
		x++;
		y++;
		if(x>y)swap(x,y);
		ans=find(root[y],1,n,x,y);
		printf("%d\n",ans);
	}
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef pair<int,int> pii;
const long long mod=1000000007;
int n,ai[N],q;
long long inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;int v;
	Node(){l=r=NULL;v=1;}
};

Node nod[9919810];
Node* pos=nod;

Node* NewNode(){return pos++;}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline long long KSM(long long a,long long p){
	long long ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,int v){
	if(pre==NULL) pre=Nul;
	now->v=1ll*pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline int query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);int ret=1;
	if(ql<=mid) ret=1ll*ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=1ll*ret*query(now->r,mid+1,r,ql,qr)%mod;
	return (int)ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef long long ll;
typedef pair<int,long long> pii;
const ll mod=1000000007;
int n,ai[N],q;
ll inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;int v;
	Node(){l=r=NULL;v=1;}
};

Node* NewNode(){return new Node();}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline ll KSM(ll a,ll p){
	ll ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,int v){
	if(pre==NULL) pre=Nul;
	now->v=1ll*pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline ll query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);ll ret=1;
	if(ql<=mid) ret=ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=ret*query(now->r,mid+1,r,ql,qr)%mod;
	return ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

inline ll sumv(Node* now){if(now) return now->v;return 1;}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef pair<int,int> pii;
const long long mod=1000000007;
int n,ai[N],q;
long long inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;int v;
	Node(){l=r=NULL;v=1;}
};

Node* NewNode(){return new Node();}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline long long KSM(long long a,long long p){
	long long ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,int v){
	if(pre==NULL) pre=Nul;
	now->v=1ll*pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline int query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);int ret=1;
	if(ql<=mid) ret=1ll*ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=1ll*ret*query(now->r,mid+1,r,ql,qr)%mod;
	return (int)ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef pair<int,int> pii;
const long long mod=1000000007;
int n,ai[N],q;
long long inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;int v;
	Node(){l=r=NULL;v=1;}
};

Node nod[29198100];
Node* pos=nod;

Node* NewNode(){return pos++;}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline long long KSM(long long a,long long p){
	long long ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,int v){
	if(pre==NULL) pre=Nul;
	now->v=1ll*pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline int query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);int ret=1;
	if(ql<=mid) ret=1ll*ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=1ll*ret*query(now->r,mid+1,r,ql,qr)%mod;
	return (int)ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef long long ll;
typedef pair<int,int> pii;
const ll mod=1000000007;
int n,ai[N],q;
ll inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;int v;
	Node(){l=r=NULL;v=1;}
};

Node* NewNode(){return new Node();}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline ll KSM(ll a,ll p){
	ll ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,int v){
	if(pre==NULL) pre=Nul;
	now->v=1ll*pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline ll query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);ll ret=1;
	if(ql<=mid) ret=ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=ret*query(now->r,mid+1,r,ql,qr)%mod;
	return ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

inline ll sumv(Node* now){if(now) return now->v;return 1;}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef long long ll;
typedef pair<int,long long> pii;
const ll mod=1000000007;
int n,ai[N],q;
ll inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;ll v;
	Node(){l=r=NULL;v=1;}
};

Node* NewNode(){return new Node();}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline ll KSM(ll a,ll p){
	ll ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,ll v){
	if(pre==NULL) pre=Nul;
	now->v=pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline ll query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);ll ret=1;
	if(ql<=mid) ret=ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=ret*query(now->r,mid+1,r,ql,qr)%mod;
	return ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

inline ll sumv(Node* now){if(now) return now->v;return 1;}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=100050;
typedef pair<int,int> pii;
const long long mod=1000000007;
int n,ai[N],q;
long long inv[N<<1],ans;
stack<pii > v[N<<1];
struct Node{
	Node* l;Node* r;int v;
	Node(){l=r=NULL;v=1;}
};

Node nod[8000000];
Node* pos=nod;

Node* NewNode(){return pos++;}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline long long KSM(long long a,long long p){
	long long ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,int v){
	if(pre==NULL) pre=Nul;
	now->v=1ll*pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline int query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);int ret=1;
	if(ql<=mid) ret=1ll*ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=1ll*ret*query(now->r,mid+1,r,ql,qr)%mod;
	return (int)ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef pair<int,int> pii;
const long long mod=1000000007;
int n,ai[N],q;
long long inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;int v;
	Node(){l=r=NULL;v=1;}
};

Node nod[19198100];
Node* pos=nod;

Node* NewNode(){return pos++;}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline long long KSM(long long a,long long p){
	long long ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,int v){
	if(pre==NULL) pre=Nul;
	now->v=1ll*pre->v*v%mod;
//	if(v==3) cout<<l<<" "<<r<<" "<<endl;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline int query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);int ret=1;
	if(ql<=mid) ret=1ll*ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=1ll*ret*query(now->r,mid+1,r,ql,qr)%mod;
	return (int)ret;
}

inline void add(int& num,int w,int i){
	int t=1,yp;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
//	if(i==9) cout<<"uhp\n";
	Build(tp,tmp,1,n,i,t);yp=t;
//	if(i==9) cout<<"nj\n";
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();

		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().second]);
			t/=v[w].top().second;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	v[w].push(make_pair(i,yp));
}

void out(Node* now,int l,int r){
	if(now==NULL) now=Nul;
	if(l==r){
		cout<<now->v<<" ";
		return;
	}
	int mid=((l+r)>>1);
	out(now->l,l,mid);
	out(now->r,mid+1,r);
}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
//		cout<<i<<" ";
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
//		cout<<"nmsl\n";
		if(num!=1) add(num,num,i);
//		cout<<v[2].size()<<" "<<v[5].size()<<endl;
		Rt[i]=tmp;
//		out(Rt[i],1,n);cout<<endl;
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
//		cout<<x<<" "<<y<<endl;
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int N=200050;
typedef long long ll;
typedef pair<int,long long> pii;
const ll mod=1000000007;
int n,ai[N],q;
ll inv[N],ans;
stack<pii > v[N];
struct Node{
	Node* l;Node* r;ll v;
	Node(){l=r=NULL;v=1;}
};

Node* NewNode(){return new Node();}

Node* Rt[N];Node* tmp;Node* tp;Node* Nul;

inline ll KSM(ll a,ll p){
	ll ret=1;
	while(p){
		if(p&1) ret=ret*a%mod;
		a=a*a%mod;
		p>>=1;
	} return ret;
}

inline void Build(Node* pre,Node* now,int l,int r,int k,ll v){
	if(pre==NULL) pre=Nul;
	now->v=pre->v*v%mod;
	if(l==r) return;
	int mid=((l+r)>>1);
	if(k<=mid){
		now->r=pre->r;now->l=NewNode();
		Build(pre->l,now->l,l,mid,k,v);
	}
	else{
		now->l=pre->l;now->r=NewNode();
		Build(pre->r,now->r,mid+1,r,k,v);
	}
	return;
}

inline ll query(Node* now,int l,int r,int ql,int qr){
	if(now==NULL) return 1;
	if(ql<=l && r<=qr) return now->v;
	int mid=((l+r)>>1);ll ret=1;
	if(ql<=mid) ret=ret*query(now->l,l,mid,ql,qr)%mod;
	if(qr>mid) ret=ret*query(now->r,mid+1,r,ql,qr)%mod;
	return ret;
}

inline void add(int num,int w,int i){
	int t=1;tp=tmp;tmp=NewNode();
	while(num%w==0) num/=w,t*=w;
	Build(tp,tmp,1,n,i,t);
	while(t!=1 && !v[w].empty()){
		tp=tmp;tmp=NewNode();
		if(v[w].top().second<=t){
			Build(tp,tmp,1,n,v[w].top().first,inv[v[w].top().first]);
			t/=v[w].top().first;v[w].pop();
		}
		else{
			Build(tp,tmp,1,n,v[w].top().first,inv[t]);
			v[w].top().second/=t;t=1;
		}
	}
	if(t!=1) v[w].push(make_pair(i,t));
}

inline ll sumv(Node* now){if(now) return now->v;return 1;}

int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&ai[i]);
	for(int i=1;i<N;i++) inv[i]=KSM(i,mod-2);
	Rt[0]=NewNode();Nul=NewNode();
	for(int i=1;i<=n;i++) {
		int num=ai[i];tmp=Rt[i-1];
		for(int w=2;w<=sqrt(ai[i]);w++)
			if(num%w==0) add(num,w,i);
		if(num!=1) add(num,num,i);
//		cout<<sumv(tmp)<<" "<<sumv(tmp->l)<<" "<<sumv(tmp->r)<<" "<<sumv(tmp->l->l)<<" "<<sumv(tmp->l->r)<<endl;
		Rt[i]=tmp;
	}
//	return 0;
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		x=1ll*(ans+x)%n+1;y=1ll*(ans+y)%n+1;
		if(x>y) swap(x,y);
		printf("%d\n",ans=query(Rt[y],1,n,x,y));
	}
	return 0;
}


#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<=400;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=400;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;
//		cout<<"gg "<<l<<' '<<r<<' '<<last<<endl;
//		cout<<s[r]<<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;
//		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 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];
		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;
//		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 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)
			{
				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;
	}

}


#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<<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;
//	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];
		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;
//		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 200005
#define mod 1000000007
using namespace std;

int n,q,a[100005],pre[200005],rt[4000005],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[35000000],ls[35000000],rs[35000000];

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

}


#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)
	{
		if(l==r&&l==3)
		cout<<v<<endl;
		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;
	}

}


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

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

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=400;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=400;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;
//		cout<<"gg "<<l<<' '<<r<<' '<<last<<endl;
//		cout<<s[r]<<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*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();
	if(n==1000)	cout<<tot<<endl;
	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;
	}

}


#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<=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;
	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 200005
#define mod 1000000007
using namespace std;

int n,q,a[100005],pre[200005],rt[4000005],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;
	}

}


#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 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];
		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 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)	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[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)
	{
		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];
		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 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<<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);
	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<<getsum(root[l-1],1,n,r,n)<<' '<<s[r]<<endl;
		cout<<last<<endl;
	}

}


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

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

void init()		//ÏÈÇó³öËùÓÐÖÊÊý
{
	for(int i=2;i<=400;i++)
	{
		if(is_prime[i])	continue;
		p[++cnt]=i;
		for(int j=i*2;j<=400;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 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*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)
	{
		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;
	}

}