結果

問題 No.1653 Squarefree
ユーザー lam6er
提出日時 2025-04-16 15:34:43
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,427 bytes
コンパイル時間 325 ms
コンパイル使用メモリ 81,716 KB
実行使用メモリ 292,392 KB
最終ジャッジ日時 2025-04-16 15:39:07
合計ジャッジ時間 6,789 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 3
other TLE * 1 -- * 37
権限があれば一括ダウンロードができます

ソースコード

diff #

import math

def sieve_segment(n):
    if n < 2:
        return []
    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 : n+1 : i] = [False] * len(sieve[i*i : n+1 : i])
    return [i for i, is_p in enumerate(sieve) if is_p]

def segmented_sieve(n):
    if n < 2:
        return []
    sqrt_n = int(math.isqrt(n))
    small_primes = sieve_segment(sqrt_n)
    primes = []
    segment_size = sqrt_n
    low = 2
    while low <= n:
        high = min(low + segment_size - 1, n)
        sieve = [True] * (high - low + 1)
        for p in small_primes:
            start = max(p * p, ((low + p - 1) // p) * p)
            start -= low
            if start < 0:
                start += p
            for j in range(start, len(sieve), p):
                sieve[j] = False
        for i in range(len(sieve)):
            if sieve[i]:
                primes.append(low + i)
        low = high + 1
    return primes

L, R = map(int, input().split())

size = R - L + 1
is_square_free = [True] * size

max_p = int(math.isqrt(R))
primes = segmented_sieve(max_p)

for p in primes:
    s = p * p
    if s > R:
        continue
    first = ((L + s - 1) // s) * s
    if first > R:
        continue
    start_idx = first - L
    step = s
    for idx in range(start_idx, size, step):
        is_square_free[idx] = False

print(sum(is_square_free))
0