Advertisement
Guest User

Untitled

a guest
Apr 30th, 2023
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.74 KB | None | 0 0
  1. """2016 Q3: prime connections"""
  2.  
  3. from math import log2
  4. from collections import deque
  5.  
  6. def find_primes(prime_limit):
  7.     primes = set()
  8.  
  9.     # For a performance hack, you can swap this for an array, but as it is, a
  10.     # list is just about fast enough.
  11.     #
  12.     # numbers = array.array('L', range(0, prime_limit + 1))
  13.     numbers = list(range(0, prime_limit + 1))
  14.  
  15.     numbers[0] = 0
  16.     numbers[1] = 0
  17.  
  18.     for i in range(2, prime_limit + 1):
  19.         if numbers[i] == 0:
  20.             continue
  21.  
  22.         primes.add(i)
  23.  
  24.         for j in range(2 * i, prime_limit + 1, i):
  25.             numbers[j] = 0
  26.  
  27.     return primes
  28.  
  29.  
  30. def shortest_path(primes, start, end, max_prime):
  31.     q = deque([(1, start)])
  32.     upper_bit_limit = int(log2(max_prime)) + 1
  33.     primes.remove(start)
  34.     while len(q) > 0:
  35.         (prev_len, node) = q.popleft()
  36.         if node == end:
  37.             return prev_len
  38.  
  39.         for i in range(upper_bit_limit):
  40.             diff = 1 << i
  41.  
  42.             next_one = node + diff
  43.             if next_one in primes:
  44.                 primes.remove(next_one)
  45.                 q.append((prev_len + 1, next_one))
  46.  
  47.             next_one = node - diff
  48.             if next_one in primes:
  49.                 primes.remove(next_one)
  50.                 q.append((prev_len + 1, next_one))
  51.  
  52.     print("Not found")
  53.     return None
  54.  
  55.  
  56. def solve(prime_limit, start, end):
  57.     """
  58.    1. Find all of the primes <= prime_limit
  59.    2. BFS to find the minimum distance between start and end
  60.    """
  61.  
  62.     primes = find_primes(prime_limit)
  63.     return shortest_path(primes, start, end, prime_limit)
  64.  
  65.  
  66. if __name__ == "__main__":
  67.     prime_limit, start, end = tuple(int(x) for x in input().split())
  68.  
  69.     print(solve(prime_limit, start, end))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement