結果
問題 | No.12 限定された素数 |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:50:08 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 916 ms / 5,000 ms |
コード長 | 1,809 bytes |
コンパイル時間 | 292 ms |
コンパイル使用メモリ | 82,232 KB |
実行使用メモリ | 240,052 KB |
最終ジャッジ日時 | 2025-03-26 15:50:52 |
合計ジャッジ時間 | 23,909 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 26 |
ソースコード
from bisect import bisect_left, bisect_right def main(): import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]) idx += 1 A = input[idx:idx+N] s_set = set(A) sieve_limit = 5000000 primes = [] sieve = [True] * (sieve_limit + 1) sieve[0] = sieve[1] = False for i in range(2, int(sieve_limit**0.5) + 1): if sieve[i]: sieve[i*i::i] = [False] * len(sieve[i*i::i]) for i in range(sieve_limit + 1): if sieve[i]: primes.append(i) valid_primes = [] invalid_primes = [] for p in primes: p_str = str(p) valid = True for c in p_str: if c not in s_set: valid = False break if valid: valid_primes.append(p) else: invalid_primes.append(p) invalid_primes = [0] + invalid_primes + [5000001] valid_primes.sort() s = set(s_set) max_diff = -1 for i in range(len(invalid_primes) - 1): prev = invalid_primes[i] next_ = invalid_primes[i+1] a = prev + 1 b = next_ - 1 if a > b: continue left = bisect_left(valid_primes, a) right = bisect_right(valid_primes, b) primes_in_range = valid_primes[left:right] if not primes_in_range: continue current_digits = set() for p in primes_in_range: current_digits.update(str(p)) if len(current_digits) == len(s): break if current_digits == s: current_diff = b - a if current_diff > max_diff: max_diff = current_diff print(max_diff if max_diff != -1 else -1) if __name__ == "__main__": main()