#include #include #include #define N_MAX 10 #define L_MAX 5000000 using namespace std; typedef struct { int value; int usednum; }Prime; int bitNum(int n) { int bit = 0; while (n) { bit |= 1 << (n % 10); n /= 10; } return bit; } vector* getPrime(int N) { auto list = new bool[N + 1]; auto prime = new vector(); int sn = (int)sqrt(N); list[0] = list[1] = false; for (int i = 2; i <= N; ++i) list[i] = true; for (int i = 2; i <= sn; ++i) { if (list[i]) { int jmax = N / i; for (int j = i; j <= jmax; ++j) list[i*j] = false; } } for (int i = 2; i <= N; ++i) { if (list[i]) { prime->push_back(Prime{ i, bitNum(i) }); } } delete[] list; return prime; } int main() { int N, A[N_MAX], AA = 0, revAA, LK = -1; auto prime = getPrime(L_MAX); int num; cin >> N; for (int i = 0; i < N; ++i) { cin >> A[i]; AA |= 1 << A[i]; } revAA = ~AA; //全使用の自明パターン if (N == 10) { cout << L_MAX - 1 << endl; return 0; } int used = 0, start = 1; for (auto it = prime->begin(); it != prime->end(); ++it) { if ((*it).usednum & revAA) { if (used == AA) { if ((*it).value - start - 1 > LK) LK = (*it).value - start - 1; } start = (*it).value + 1; used = 0; } else { used |= (*it).usednum; } } //端処理 if ((used == AA) && (L_MAX - start > LK)) LK = L_MAX - start; cout << LK << endl; delete prime; return 0; }