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; } }