• + 0 comments

    Python 3. Sieve of Eratosthenes

    n, q = list(map(int, input().split()))
    
    number = list(map(int, input().rstrip().split()))
    length = len(number)
    
    def get_primes(n, q):
        # Primes using Sieve of Eratosthenes
        primes = list()
        sieve = [True] * (n+1)
        for p in range(2, n+1):
            if sieve[p]:
                primes.append(p)
                for i in range(p, n+1 ,p):
                    sieve[i] = False
            if len(primes) >= q: # we only need the first q prime numbers
                break
        return primes
        
    primes = get_primes(max(number), q)
    A = []
    B= []
    for _ in range(q):
        p = primes.pop(0) # the first prime number in the list
        for elem in number:
            if elem % p == 0: # check divisibility with prime number
                B.append(elem)
            else:
                A.append(elem)
                
        number = list(reversed(A)) # reverse the remainder elements for next iteration
        A = [] 
    
    if len(B) == length:
        print(*B, sep="\n")
    else:
        print(*(B + list(reversed(number))), sep="\n")