import java.io.*;
import java.math.*;
import java.util.*;
class U {
static boolean debug = false;
static void out(String s) { System.out.println(s); }
static void out_(String s) { System.out.print(s); }
static void d(String s) { if (debug) out(s); }
static void d_(String s) { if (debug) out_(s); }
static void azzert(boolean b) { if (!b) throw new RuntimeException(); }
}
public class D {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
int P = console.nextInt();
boolean[] isPrime = sieve();
boolean[] isHappy = happy();
for (int p=0; p < P; p++) {
int K = console.nextInt();
int n = console.nextInt();
if (isPrime[n] && isHappy[n]) {
U.d(K + " " + n + " isPrime: " + isPrime[n]);
U.d(K + " " + n + " isHappy: " + isHappy[n]);
U.out(K + " " + n + " YES");
} else {
U.d(K + " " + n + " isPrime: " + isPrime[n]);
U.d(K + " " + n + " isHappy: " + isHappy[n]);
U.out(K + " " + n + " NO");
}
}
}
public static boolean[] sieve() {
boolean[] isPrime = new boolean[10001];
for (int i = 0; i < isPrime.length; i++) {
isPrime[i] = true;
}
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i < isPrime.length; i++) {
if (!isPrime[i]) {
continue;
}
int n = 2*i;
while (n < isPrime.length) {
isPrime[n] = false;
n += i;
}
}
return isPrime;
}
public static boolean[] happy() {
boolean[] isHappy = new boolean[10001];
boolean[] isVisited = new boolean[10001];
isHappy[0] = false;
isHappy[1] = true;
isVisited[0] = true;
isVisited[1] = true;
for (int i = 2; i < isHappy.length; i++) {
int n = i;
ArrayList<Integer> visited = new ArrayList<Integer>();
while (!isVisited[n]) {
visited.add(n);
isVisited[n] = true;
int nextN = 0;
while(n != 0) {
nextN += (n%10) * (n%10);
n /= 10;
}
n = nextN;
}
if (isHappy[n]) {
// all visited are happy!
for (int thisVisited : visited) {
isHappy[thisVisited] = true;
}
}
}
return isHappy;
}
}