結果

問題 No.308 素数は通れません
ユーザー qwewe
提出日時 2025-05-14 12:49:01
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,665 bytes
コンパイル時間 184 ms
コンパイル使用メモリ 82,668 KB
実行使用メモリ 77,068 KB
最終ジャッジ日時 2025-05-14 12:50:21
合計ジャッジ時間 7,214 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 14 WA * 45 TLE * 1 -- * 47
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

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]:
        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 check_segment(start, end):
    if start > end:
        return True
    for num in range(start, end + 1):
        if num < 2:
            continue
        if is_prime(num):
            return False
    return True

def check_steps(W, h):
    max_steps = 1000
    for k in range(1, min(h, max_steps) + 1):
        num = k * W + 1
        if is_prime(num):
            return False
    return True

def find_min_w(N):
    min_w = N - 1
    max_w_to_check = 10**6
    for W in range(2, max_w_to_check + 1):
        if W >= min_w:
            break
        if is_prime(W + 1):
            continue
        h = (N - 1) // W
        start = h * W + 1
        end = N
        if start > end:
            continue
        if not check_segment(start, end):
            continue
        if not check_steps(W, h):
            continue
        if W < min_w:
            min_w = W
    return min_w

def main():
    N = int(sys.stdin.readline())
    if N == 1:
        print(1)
        return
    min_w = N - 1
    candidate = find_min_w(N)
    print(min(candidate, min_w))

if __name__ == '__main__':
    main()
0