結果

問題 No.12 限定された素数
ユーザー vjudge1
提出日時 2025-09-06 08:50:11
言語 Crystal
(1.14.0)
結果
AC  
実行時間 86 ms / 5,000 ms
コード長 956 bytes
コンパイル時間 12,449 ms
コンパイル使用メモリ 310,412 KB
実行使用メモリ 13,768 KB
最終ジャッジ日時 2025-09-06 08:50:27
合計ジャッジ時間 15,321 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 26
権限があれば一括ダウンロードができます

ソースコード

diff #

M = 5_000_000

n = gets.to_s.to_i
a = gets.to_s.split.map(&.to_i)
b = Array.new(10, false)
a.each { |x| b[x] = true }

is_prime = Array.new(M + 1, true)
primes = [] of Int32

(2..M).each do |i|
  if is_prime[i]
    primes << i
    j = 2 * i
    while j <= M
      is_prime[j] = false
      j += i
    end
  end
end

primes << M + 1

solve = ->(p : Int32) do
  res = Array.new(10, false)
  num = p
  while num > 0
    res[num % 10] = true
    num //= 10
  end
  res
end

now = Array.new(10, false)
ans = -1
last = 0

(0...primes.size - 1).each do |i|
  c = solve.call(primes[i])
  flag = false
  
  (0..9).each do |j|
    if c[j] && !b[j]
      flag = true
      break
    end
  end
  
  if flag
    (0..9).each { |j| now[j] = false }
    last = primes[i]
    next
  end
  
  (0..9).each do |j|
    if c[j]
      now[j] = true
    end
  end
  
  if b == now
    candidate = primes[i + 1] - last - 2
    ans = candidate if candidate > ans
  end
end

puts ans
0