結果
問題 |
No.371 ぼく悪いプライムじゃないよ
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:39:26 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,513 bytes |
コンパイル時間 | 396 ms |
コンパイル使用メモリ | 82,120 KB |
実行使用メモリ | 100,364 KB |
最終ジャッジ日時 | 2025-04-01 01:03:24 |
合計ジャッジ時間 | 25,941 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 25 TLE * 17 |
ソースコード
import sys import math def sieve(n): sieve = [True] * (n+1) sieve[0] = sieve[1] = False for i in range(2, int(math.isqrt(n)) + 1): if sieve[i]: sieve[i*i::i] = [False]*len(sieve[i*i::i]) primes = [] for i, is_prime in enumerate(sieve): if is_prime: primes.append(i) return primes def is_prime(n): if n < 2: return False for p in [2,3,5,7,11,13,17,19,23,29,31,37]: if n % p == 0: return n == p d = n-1 s = 0 while d % 2 == 0: d //= 2 s += 1 for a in [2,3,5,7,11,13,17,19,23,29,31,37]: if a >= n: continue x = pow(a, d, n) if x == 1 or x == n-1: continue for _ in range(s-1): x = pow(x, 2, n) if x == n-1: break else: return False return True def main(): L, H = map(int, sys.stdin.readline().split()) max_h = int(math.isqrt(H)) + 1 primes = sieve(max_h) primes_desc = sorted(primes, reverse=True) candidates = [] max_p = -1 max_n = -1 for p in primes_desc: k_max = H // p if k_max < p: continue d_list = [prime for prime in primes if prime < p] if p == 2: n = p * k_max if n >= L: if p > max_p or (p == max_p and n > max_n): max_p = p max_n = n continue found = False k_candidate = -1 start = min(k_max, H//p) for k in range(start, p-1, -1): valid = True for d in d_list: if d * d > k: break if k % d == 0: valid = False break if not valid: continue if valid: if k < p*p and not is_prime(k): continue k_candidate = k found = True break if found: n = p * k_candidate if n < L: continue if p > max_p or (p == max_p and n > max_n): max_p = p max_n = n if max_p != -1: print(max_n) return start = max(2, L) for n in range(H, start-1, -1): if n < L: break if is_prime(n): continue print(n) return print(L) if __name__ == '__main__': main()