• + 0 comments
    import math
    
    # using sieve_of_eratosthenes to find primes with a range [2, nth]
    def find_primes(n):
        if n < 1:
            return []
        if n == 1:
            return [2]
        # Estimate upper bound for nth prime using prime number theorem
        if n < 6:
            upper_bound = 15
        else:
            upper_bound = int(n * (math.log(n) + math.log(math.log(n)))) + 10
        sieve = [True] * (upper_bound + 1)
        sieve[0], sieve[1] = False, False
        primes = []
        for i in range(2, upper_bound + 1):
            if sieve[i]:
                primes.append(i)
                if len(primes) == n:
                    return primes
                for j in range(i * i, upper_bound + 1, i):
                    sieve[j] = False
        # In case the sieve didn't reach enough primes (very rare with this padding)
        # Fill with extra primes if needed
        i = upper_bound + 1
        while len(primes) < n:
            is_prime = True
            for p in primes:
                if p*p > i:
                    break
                if i % p == 0:
                    is_prime = False
                    break
            if is_prime:
                primes.append(i)
            i += 1
        return primes
        
        # my code
    def waiter(number, q):
        # Write your code here
        primes = find_primes(q)
        ans = []
        
        for p in primes:
            a, b =[], []
            while number:
                n = number.pop()
                if n%p ==0:
                    b.append(n)
                else:
                    a.append(n)
            ans.extend(reversed(b))
            number = a
        ans.extend(reversed(a))
        return ans