int n, m, _m, ans; int a[kMaxV], b[kMaxN], match[kMaxN]; bool vis[kMaxN], exi[kMaxN]; std::vector<int> G[kMaxN];
boolisprime(int n){ if (n <= 2) return0; for (int i = 2; i * i <= n; ++i) if (n % i == 0) return0; return1; }
booldfs(int u){ for (auto v : G[u]) { if (vis[v]) continue; vis[v] = 1; if (!match[v] || dfs(match[v])) { match[v] = u; return1; } } return0; }
voidsolve1(){ for (int i = 1; i <= m; ++i) { if (b[i] & 1) { for (int j = 1; j <= m; ++j) if ((~b[j] & 1) && isprime(abs(b[i] - b[j]))) G[i].emplace_back(j); } } for (int i = 1; i <= m; ++i) { if (b[i] & 1) { std::fill_n(vis + 1, m, 0); dfs(i); } } for (int i = 1; i <= m; ++i) { if (match[i]) { exi[i] = exi[match[i]] = 1; ++ans, _m -= 2; } } }
voidsolve2(){ int cnt[2] = {0}; for (int i = 1; i <= m; ++i) { if (!exi[i]) ++cnt[b[i] & 1]; } ans += 2 * (cnt[0] / 2 + cnt[1] / 2), _m -= 2 * (cnt[0] / 2 + cnt[1] / 2); }
voidsolve3(){ if (_m) ans += 3; }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) { int x; std::cin >> x; a[x] = 1; } for (int i = 1; i <= 1e7 + 1; ++i) if (a[i] ^ a[i - 1]) b[++m] = i; _m = m; solve1(), solve2(), solve3(); std::cout << ans << '\n'; }