#include typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(int)(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() using namespace std; std::vector sieve(int n) { std::vector is_prime(n+1); fill(is_prime.begin(), is_prime.end(), true); is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; ++i) { if ( is_prime[i] ) { for (int j = 2*i; j <= n; j += i) is_prime[j] = false; } } std::vector ans; for (int i = 0; i < is_prime.size(); ++i) { if ( is_prime[i] ) ans.push_back(i); } return std::move(ans); } class Yuki0012 { public: void store(int x, vector &use) { while (x) { use[x%10] = true; x /= 10; } } bool check(const set &enable, vector &use) { for (int i = 0; i < use.size(); ++i) { if ( use[i] && !enable.count(i) ) return false; } return true; } void solve(void) { int N; cin>>N; set enable; REP(i,N) { int a; cin>>a; enable.insert(a); } auto primes = sieve(5000000); int n = primes.size(); int l,r; vector cnt(10,0); int maxDiff = -1; l = r = 0; REP(i,n) { vector use(10,0); store(primes[i], use); if ( !check(enable, use) ) { l = r = i+1; fill(RANGE(cnt), 0); continue; } REP(j, use.size()) { if ( !use[j] ) continue; cnt[j]++; } int cn = 0; REP(j, cnt.size()) { if ( cnt[j] ) ++cn; } if ( cn == enable.size() ) { // [l,r) int lower = primes[l]; int upper = primes[r]; if ( l > 0 ) lower = primes[l-1]+1; if ( l == 0 ) lower = 1; if ( r < primes.size()-1 ) upper = primes[r+1]-1; if ( r == primes.size()-1 ) upper = 5000000; maxDiff = max(maxDiff, upper-lower); } r = i+1; } cout<solve(); delete obj; return 0; } #endif