#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
int mod = 1000000007;
int add(int x, int y) { return (x += y) >= mod ? x - mod : x; }
template<class... T> int add(int x, T... y) { return add(x, add(y...)); }
int mul(int x, int y) { return 1LL * x * y % mod; }
template<class... T> int mul(int x, T... y) { return mul(x, mul(y...)); }
map<int, int> enumpr(int n) {
map<int, int> V;
for (int i = 2; i*i <= n; i++) while (n%i == 0) V[i]++, n /= i;
if (n>1) V[n]++;
return V;
}
//-----------------------------------------------------------------------------------
int N, Q, X[101010], L[101010], R[101010];
int ans[101010];
int S = 765;
//-----------------------------------------------------------------------------------
map<int, int> cnt;
void remove(int i) {
if (i < 0) return;
auto e = enumpr(X[i]);
for (auto p : e) cnt[p.first] -= p.second;
}
void add(int i) {
if (i < 0) return;
auto e = enumpr(X[i]);
for (auto p : e) cnt[p.first] += p.second;
}
int get() {
int ret = 1;
for (auto p : cnt) ret = mul(ret, p.second + 1);
return ret;
}
//-----------------------------------------------------------------------------------
int main() {
cin >> N >> Q;
rep(i, 0, N) scanf("%d", &X[i]);
rep(i, 0, Q) scanf("%d%d", &L[i], &R[i]);
rep(i, 0, Q) L[i]--, R[i]--;
vector<int> ord;
rep(i, 0, Q) ord.push_back(i);
sort(ord.begin(), ord.end(), [&](int a, int b) {
if (L[a] / S != L[b] / S) return L[a] / S < L[b] / S;
else return R[a] < R[b];
});
int i = -1, j = -1;
rep(_i, 0, Q) {
int o = ord[_i];
while (i < L[o]) remove(i++);
while (i > L[o]) add(--i);
while (j < R[o]) add(++j);
while (j > R[o]) remove(j--);
ans[o] = get();
}
rep(i, 0, Q) printf("%d\n", ans[i]);
}