結果

問題 No.371 ぼく悪いプライムじゃないよ
ユーザー lam6er
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0