#include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; bool is_prime[5000010]; void setup_prime_table() { memset(is_prime, false, sizeof(is_prime)); bool checked[5000010]; memset(checked, false, sizeof(checked)); for (ll i = 2; i <= 5000000; ++i) { if (!checked[i]) { is_prime[i] = true; checked[i] = true; for (ll j = i * i; j <= 5000000; j += i) { checked[j] = true; } } } } bool A[10]; bool is_valid_range(vector &counter) { for (int v = 0; v <= 9; ++v) { if (A[v] && counter[v] == 0) return false; if (not A[v] && counter[v] > 0) return false; } return true; } bool can_move(vector &counter) { for (int v = 0; v <= 9; ++v) { if (not A[v] && counter[v] > 0) return false; } return true; } void update_counter(ll v, int diff, vector &counter) { bool checked[10]; memset(checked, false, sizeof(checked)); while (v > 0) { int i = v % 10; if (not checked[i]) counter[i] += diff; checked[i] = true; v /= 10; } } int main() { int N; cin >> N; memset(A, false, sizeof(A)); for (int i = 0; i < N; ++i) { int a; cin >> a; A[a] = true; } setup_prime_table(); int ans = -1; vector counter(10, 0); int K = 1; int L = 1; int lim = 5000000; while (K <= L) { bool ok = can_move(counter); if (is_valid_range(counter)) { ans = max(ans, L - K); } if (L >= lim) { if (is_prime[K]) { update_counter(K, -1, counter); } ++K; } else if (ok || K >= L) { ++L; if (is_prime[L]) { update_counter(L, 1, counter); } } else { if (is_prime[K]) { update_counter(K, -1, counter); } ++K; } } cout << ans << endl; return 0; }