#include <bits/stdc++.h>
using namespace std;
const int MOD =(int)1e9+7;
long long modpow(long long a,long long e = MOD - 2) {
long long r = 1;
while (e) {
if (e & 1) r = r*a%MOD;
a = a*a % MOD;
e >>= 1;
}
return r;
}
int main() {
int N;
if (!(cin >> N))
return 0;
vector<int> A(N);
int maxA = 0;
for (int i = 0;i<N;i++)
{ cin >> A[i];
maxA = max(maxA,A[i]);
}
vector<int> freq(maxA+1,0);
for (int x:A) freq[x]++;
vector<int> is_composite(maxA+1,0), primes;
for (int i =2;i*i<=maxA;i++) {
if (is_composite[i] == 0) {
for (int j = i*i; j<=maxA; j+=i)
is_composite[j] = 1;
}
}
for (int i =2;i<= maxA;i++)
if (is_composite[i] == 0)
primes.push_back(i);
vector<int> cnt = freq;
for (int p:primes)
for (int i =1;i<=maxA/p;i++)
cnt[i] += cnt[i*p];
vector<long long> fact(N+1,1),invfact(N+1,1);
for (int i = 1; i <= N; i++)
fact[i] = fact[i - 1]*i%MOD;
invfact[N] = modpow(fact[N]);
for (int i = N; i >= 1; i--)
invfact[i - 1] = invfact[i]*i%MOD;
auto C = [&](int n, int k)->long long{
if (k < 0 || k > n) return 0;
return fact[n]*invfact[k]%MOD*invfact[n - k]%MOD;
};
int Q;
cin>>Q;
struct Query {int g,idx;};
unordered_map<int, vector<Query>> bucket;
bucket.reserve(Q*2);
vector<long long> answer(Q);
for (int i =0;i<Q;i++) {
int k,g;
cin>>k>> g;
bucket[k].push_back({g, i});
}
vector<long long> S(maxA + 1), E(maxA + 1);
for (auto &entry :bucket) {
int k = entry.first;
auto &qs = entry.second;
for (int d =1;d <= maxA;d++)
S[d] = C(cnt[d], k);
E = S;
for (int p:primes)
for (int i =1;i<= maxA/p;i++) {
E[i]-= E[i * p];
if (E[i]<0) E[i]+=MOD;
}
for (int d=1;d<=maxA;d++) {
E[d]%=MOD;
if (E[d]<0)
E[d]+=MOD;
}
for (auto &q:qs) {
int g =q.g;
answer[q.idx] = (g<=maxA?E[g]:0);
}
}
for (int i=0;i<Q;i++)
cout <<answer[i]%MOD<< '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTU9EID0oaW50KTFlOSs3OwoKbG9uZyBsb25nIG1vZHBvdyhsb25nIGxvbmcgYSxsb25nIGxvbmcgZSA9IE1PRCAtIDIpIHsKICAgIGxvbmcgbG9uZyByID0gMTsKICAgIHdoaWxlIChlKSB7CiAgICAgICAgaWYgKGUgJiAxKSByID0gciphJU1PRDsKICAgICAgICBhID0gYSphICUgTU9EOwogICAgICAgIGUgPj49IDE7CiAgICB9CiAgICByZXR1cm4gcjsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgTjsKICAgIGlmICghKGNpbiA+PiBOKSkKICAgICAgcmV0dXJuIDA7CiAgICAKICAgIHZlY3RvcjxpbnQ+IEEoTik7CiAgICBpbnQgbWF4QSA9IDA7CiAgICBmb3IgKGludCBpID0gMDtpPE47aSsrKSAKICAgIHsgY2luID4+IEFbaV07CiAgICBtYXhBID0gbWF4KG1heEEsQVtpXSk7CiAgICB9CgogICAgdmVjdG9yPGludD4gZnJlcShtYXhBKzEsMCk7CiAgICBmb3IgKGludCB4OkEpIGZyZXFbeF0rKzsKCiAgICB2ZWN0b3I8aW50PiBpc19jb21wb3NpdGUobWF4QSsxLDApLCBwcmltZXM7CiAgICBmb3IgKGludCBpID0yO2kqaTw9bWF4QTtpKyspIHsKICAgICAgICBpZiAoaXNfY29tcG9zaXRlW2ldID09IDApIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkqaTsgajw9bWF4QTsgais9aSkgCiAgICAgICAgICAgICBpc19jb21wb3NpdGVbal0gPSAxOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPTI7aTw9IG1heEE7aSsrKSAKICAgICBpZiAoaXNfY29tcG9zaXRlW2ldID09IDApCiAgICAgIHByaW1lcy5wdXNoX2JhY2soaSk7CgogICAgdmVjdG9yPGludD4gY250ID0gZnJlcTsKICAgIGZvciAoaW50IHA6cHJpbWVzKQogICAgICAgIGZvciAoaW50IGkgPTE7aTw9bWF4QS9wO2krKykKICAgICAgICAgICAgY250W2ldICs9IGNudFtpKnBdOwoKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGZhY3QoTisxLDEpLGludmZhY3QoTisxLDEpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKSAKICAgICAgZmFjdFtpXSA9IGZhY3RbaSAtIDFdKmklTU9EOwogICAgaW52ZmFjdFtOXSA9IG1vZHBvdyhmYWN0W05dKTsKICAgIGZvciAoaW50IGkgPSBOOyBpID49IDE7IGktLSkKICAgICBpbnZmYWN0W2kgLSAxXSA9IGludmZhY3RbaV0qaSVNT0Q7CiAgICBhdXRvIEMgPSBbJl0oaW50IG4sIGludCBrKS0+bG9uZyBsb25newogICAgICAgIGlmIChrIDwgMCB8fCBrID4gbikgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIGZhY3Rbbl0qaW52ZmFjdFtrXSVNT0QqaW52ZmFjdFtuIC0ga10lTU9EOwogICAgfTsKCiAgICBpbnQgUTsKICAgIGNpbj4+UTsKICAgIHN0cnVjdCBRdWVyeSB7aW50IGcsaWR4O307CiAgICB1bm9yZGVyZWRfbWFwPGludCwgdmVjdG9yPFF1ZXJ5Pj4gYnVja2V0OwogICAgYnVja2V0LnJlc2VydmUoUSoyKTsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGFuc3dlcihRKTsKCiAgICBmb3IgKGludCBpID0wO2k8UTtpKyspIHsKICAgICAgICBpbnQgayxnOyAKICAgICAgICBjaW4+Pms+PiBnOwogICAgICAgIGJ1Y2tldFtrXS5wdXNoX2JhY2soe2csIGl9KTsKICAgIH0KCiAgICB2ZWN0b3I8bG9uZyBsb25nPiBTKG1heEEgKyAxKSwgRShtYXhBICsgMSk7CgogICAgZm9yIChhdXRvICZlbnRyeSA6YnVja2V0KSB7CiAgICAgICAgaW50IGsgPSBlbnRyeS5maXJzdDsKICAgICAgICBhdXRvICZxcyA9IGVudHJ5LnNlY29uZDsKICAgICAgICBmb3IgKGludCBkID0xO2QgPD0gbWF4QTtkKyspIAogICAgICAgICBTW2RdID0gQyhjbnRbZF0sIGspOwogICAgICAgIEUgPSBTOwogICAgICAgIGZvciAoaW50IHA6cHJpbWVzKQogICAgICAgICAgICBmb3IgKGludCBpID0xO2k8PSBtYXhBL3A7aSsrKSB7CiAgICAgICAgICAgICAgICBFW2ldLT0gRVtpICogcF07CiAgICAgICAgICAgICAgICBpZiAoRVtpXTwwKSBFW2ldKz1NT0Q7CiAgICAgICAgICAgIH0KICAgICAgICBmb3IgKGludCBkPTE7ZDw9bWF4QTtkKyspIHsKICAgICAgICAgICAgRVtkXSU9TU9EOwogICAgICAgICAgICBpZiAoRVtkXTwwKQogICAgICAgICAgICAgIEVbZF0rPU1PRDsKICAgICAgICB9CiAgICAgICAgZm9yIChhdXRvICZxOnFzKSB7CiAgICAgICAgICAgIGludCBnID1xLmc7CiAgICAgICAgICAgIGFuc3dlcltxLmlkeF0gPSAoZzw9bWF4QT9FW2ddOjApOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBpPTA7aTxRO2krKykgCiAgICAgY291dCA8PGFuc3dlcltpXSVNT0Q8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0K