#include #include #include #include using namespace std; using namespace atcoder; using ll = long long; static vector pt; static bool hate(ll a, ll b) { ll x = stoll(to_string(a) + to_string(b)); return pt[x]; } int main() { const int m = 1000000; pt.assign(m, true); pt[0] = pt[1] = false; for (ll p = 2; p * p < m; p++) { if (pt[p]) { for (ll q = p * p; q < m; q += p) { pt[q] = false; } } } int n; scanf("%d", &n); vector as(n), bs(n); for (int i = 0; i < n; i++) { scanf("%lld %lld", &as[i], &bs[i]); } two_sat ts(n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!hate(as[i], bs[j])) { continue; } if (i == j) { ts.add_clause(i, false, i, false); continue; } ts.add_clause(i, false, j, false); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!hate(bs[j], as[i])) { continue; } if (i == j) { ts.add_clause(i, true, i, true); continue; } ts.add_clause(i, true, j, true); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j || !hate(as[i], as[j])) { continue; } ts.add_clause(i, false, j, true); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j || !hate(bs[i], bs[j])) { continue; } ts.add_clause(i, true, j, false); } } puts(ts.satisfiable() ? "Yes" : "No"); }