#include <bits/stdc++.h>
#define ll long long
#define F first
#define S second
#define endl '\n'
#define Endl '\n'
using namespace std;
const int N = 2e5 + 5;
int tc, n, x, a[N];
bool isPrime[N];
vector<int> primes;
map<int, int> xFact;
map<pair<int, int>, int> adj;
void sieve() {
memset(isPrime, 1, sizeof isPrime);
isPrime[0] = isPrime[1] = 0;
for (int i = 2; i * i < N; i++) {
if (isPrime[i]) {
for (int j = i * i; j < N; j += i) {
isPrime[j] = 0;
}
}
}
for (int i = 2; i < N; i++) {
if (isPrime[i]) {
primes.push_back(i);
}
}
}
void factorizeOriginalX(int x) {
for (int i = 0; i < primes.size() && primes[i] * primes[i] <= x; i++) {
while (x % primes[i] == 0) {
xFact[primes[i]]++;
x /= primes[i];
}
}
if (x > 1) {
xFact[x]++;
}
}
map<int, int> factorize(int x) {
map<int, int> fact;
for (auto i : xFact) {
if (x < i.first) {
break;
}
while (x > 1 && x % i.first == 0) {
fact[i.first]++;
x /= i.first;
}
}
return fact;
}
void buildAdjascentList() {
map<int, int> fact;
set<int> st, seen;
for (int i = 0; i < n; i++) {
fact.clear();
seen.clear();
fact = factorize(a[i]);
for (auto p : fact) {
int previousVal = 0;
if (i) {
previousVal = adj[{i - 1, p.first}];
}
adj[{i, p.first}] = previousVal + p.second;
seen.insert(p.first);
}
// fill the gaps
for (auto p : xFact) {
if (!seen.count(p.first)) {
adj[{i, p.first}] = (i ? adj[{i - 1, p.first}] : 0);
}
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); // cout.tie(0);
sieve();
cin >> tc;
while (tc--) {
cin >> n >> x;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
xFact.clear();
adj.clear();
factorizeOriginalX(x);
buildAdjascentList();
int q;
cin >> q;
while (q--) {
int l, r;
cin >> l >> r;
l--, r--;
bool ok = 1;
for (auto p : xFact) {
int cnt = adj[{r, p.first}];
if (l) {
cnt -= adj[{l - 1, p.first}];
}
if (cnt < p.second) {
ok = 0;
break;
}
}
cout << (ok ? "Yes" : "No") << endl;
}
}
return 0;
}