結果
問題 | No.371 ぼく悪いプライムじゃないよ |
ユーザー |
![]() |
提出日時 | 2016-05-14 13:11:25 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 78 ms / 1,000 ms |
コード長 | 1,510 bytes |
コンパイル時間 | 439 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 11,136 KB |
最終ジャッジ日時 | 2024-12-30 18:12:28 |
合計ジャッジ時間 | 3,796 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 42 |
ソースコード
#!/usr/bin/env python3 import math import random def find_min_factor(n): assert n > 0 if n % 2 == 0: return 2 for i in range(3, n, 2): if i * i > n: return n elif n % i == 0: return i def is_prime_miller_rabin(n, k=30): assert n > 0 if n == 2: return True elif n == 1 or n % 2 == 0: return False d = n - 1 s = 0 while d % 2 == 0: d //= 2 s += 1 for i in range(k): a = random.randint(1, n - 1) if pow(a, d, n) != 1: for r in range(0, s): if pow(a, d * 2 ** r, n) == n - 1: break else: return False return True def solve(l, h): answer = 0 max_min_factor = 0 # c = p * d # c (>= 4) : a composite number # p (>= 2) : a prime number # d (>= 2) : an integer for p in range(2, math.floor(math.sqrt(h)) + 1)[:: -1]: if p < max_min_factor: break elif h // p * p < l or not is_prime_miller_rabin(p): continue for d in range(p, h // p + 1)[:: -1]: c = p * d if l > c: break f = find_min_factor(c) if max_min_factor < f or max_min_factor == f and answer < c: max_min_factor = f answer = c return answer def main(): l, h = map(int, input().split()) print(solve(l, h)) if __name__ == '__main__': main()