#include <bits/stdc++.h>
using namespace std;
template <typename Tp>
inline void read(Tp &x) {
  static char c;
  static bool neg;
  x = 0, c = getchar(), neg = false;
  for (; !isdigit(c); c = getchar()) {
    if (c == '-') {
      neg = true;
    }
  }
  for (; isdigit(c); c = getchar()) {
    x = x * 10 + c - '0';
  }
  if (neg) {
    x = -x;
  }
}
namespace Math {
const int N = 31622800;
const int MX = 1952000;
bool notPrime[N];
int prime[MX], primeCnt = 0;
inline void sieve() {
  notPrime[1] = true;
  for (int i = 2; i < N; ++i) {
    if (!notPrime[i]) {
      prime[++primeCnt] = i;
    }
    for (int j = 1, p; j <= primeCnt; ++j) {
      p = prime[j];
      if (i * p >= N) {
        break;
      }
      notPrime[i * p] = true;
      if (i % p == 0) {
        break;
      }
    }
  }
}
long long fac[20], facTop = 0;
inline void factor(long long x) {
  facTop = 0;
  for (int i = 1, p; i <= primeCnt; ++i) {
    p = prime[i];
    if ((long long)p * p > x) {
      break;
    }
    if (x % p == 0) {
      do {
        x /= p;
      } while (x % p == 0);
      fac[++facTop] = p;
    }
  }
  if (x != 1) {
    fac[++facTop] = x;
  }
}
}  // namespace Math
namespace G {
const int N = 1e5 + 5;
long long dis[N];
inline void dijkstra() {
  memset(dis, 0x3f, sizeof(dis));
  priority_queue<pair<long long, int>> q;
  dis[0] = 0LL;
  q.emplace((pair<long long, int>){0LL, 0});
  while (!q.empty()) {
    auto p = q.top();
    q.pop();
    long long w = p.first;
    int u = p.second;
    if (w == dis[u]) {
      for (int i = 2, v; i <= Math::facTop; ++i) {
        v = (u + Math::fac[i]) % Math::fac[1];
        if (dis[v] > w + Math::fac[i]) {
          dis[v] = w + Math::fac[i];
          q.emplace((pair<long long, int>){dis[v], v});
        }
      }
    }
  }
}
}  // namespace G
inline int inv(long long x, int MOD) {
  int base = x % MOD, exp = MOD - 2, res = 1;
  while (exp != 0) {
    if (exp & 1) {
      res = (long long)res * base % MOD;
    }
    base = (long long)base * base % MOD;
    exp >>= 1;
  }
  return res;
}
const int N = 1e4 + 5;
int T;
struct Query {
  long long n, k;
  int id;
  inline const bool operator<(const Query &rhs) const { return k < rhs.k; }
};
Query query[N];
bool ans[N];
int main() {
  Math::sieve();
  read(T);
  long long n, k;
  for (int cas = 1; cas <= T; ++cas) {
    read(n), read(k);
    query[cas] = (Query){n, k, cas};
  }
  sort(query + 1, query + T + 1);
  for (int i = 1, fac; i <= T; ++i) {
    n = query[i].n, k = query[i].k;
    if (k == 1) {
      ans[query[i].id] = false;
    } else {
      if (k != query[i - 1].k) {
        Math::factor(k);
        fac = Math::facTop;
        if (fac > 2) {
          G::dijkstra();
        }
      }
      if (fac == 1) {
        ans[query[i].id] = (bool)(n % Math::fac[1] == 0);
      } else if (fac == 2) {
        long long a = Math::fac[1], b = Math::fac[2];
        int y = n % a * inv(b, a) % a;
        ans[query[i].id] = (bool)(b * y <= n);
      } else {
        ans[query[i].id] = (bool)(G::dis[n % Math::fac[1]] <= n);
      }
    }
  }
  for (int i = 1; i <= T; ++i) {
    puts(ans[i] ? "YES" : "NO");
  }
}
