M = 5_000_000 n = gets.not_nil!.to_i a = Array(Int32).new(n) { gets.not_nil!.to_i } # Track which digits are in input array A b = Array(Bool).new(10, false) a.each { |digit| b[digit] = true } # Sieve of Eratosthenes is_prime = Array(Bool).new(M + 1, true) is_prime[0] = is_prime[1] = false primes = [] of Int32 (2..M).each do |i| next unless is_prime[i] primes << i (2 * i).step(to: M, by: i) { |j| is_prime[j] = false } end primes << M + 1 # sentinel # Helper: extract digits present in a number def solve(p : Int32) res = Array(Bool).new(10, false) num = p while num > 0 res[num % 10] = true num //= 10 end res end now = Array(Bool).new(10, false) ans = -1 last = 0 (primes.size - 1).times do |i| c = solve(primes[i]) # Check if prime contains any digit not in original array A flag = false 10.times do |j| if c[j] && !b[j] flag = true break end end if flag # Reset current digit set and update last valid prime start now.fill(false) last = primes[i] next end # Accumulate digits from this prime 10.times { |j| now[j] = true if c[j] } # Check if accumulated digits match original set if b == now gap = primes[i + 1] - last - 2 ans = [ans, gap].max end end puts ans