fork download
  1. # your code goes here
  2. import sys
  3. import math
  4.  
  5. def simple_sieve(limit):
  6. is_prime = [True] * (limit + 1)
  7. is_prime[0:2] = [False, False]
  8. for i in range(2, int(limit**0.5) + 1):
  9. if is_prime[i]:
  10. for j in range(i*i, limit + 1, i):
  11. is_prime[j] = False
  12. return [i for i, prime in enumerate(is_prime) if prime]
  13.  
  14. def segmented_sieve(m, n, base_primes):
  15. is_prime = [True] * (n - m + 1)
  16.  
  17. for p in base_primes:
  18. start = max(p * p, ((m + p - 1) // p) * p) # first multiple of p in range [m, n]
  19. for j in range(start, n + 1, p):
  20. is_prime[j - m] = False
  21.  
  22. # Special case: if m == 1, mark 1 as not prime
  23. if m == 1:
  24. is_prime[0] = False
  25.  
  26. return [i + m for i, prime in enumerate(is_prime) if prime]
  27.  
  28. def main():
  29. t = int(sys.stdin.readline())
  30. ranges = [tuple(map(int, sys.stdin.readline().split())) for _ in range(t)]
  31.  
  32. # We only need primes up to sqrt(10^9) = 31622
  33. base_primes = simple_sieve(31623)
  34.  
  35. for idx, (m, n) in enumerate(ranges):
  36. primes_in_range = segmented_sieve(m, n, base_primes)
  37. print("\n".join(map(str, primes_in_range)))
  38. if idx != t - 1:
  39. print() # blank line between test cases
  40.  
  41. if __name__ == "__main__":
  42. main()
  43.  
Success #stdin #stdout 0.14s 14192KB
stdin
2
1 10
3 5
stdout
2
3
5
7

3
5