How to calculate smallest number with certain number of divisors?

前端 未结 9 1382
野性不改
野性不改 2020-12-29 07:51

From Project Euler problem 500

The number of divisors of 120 is 16. In fact 120 is the smallest number having 16 divisors.

Find the smalle

9条回答
  •  粉色の甜心
    2020-12-29 08:27

    As Miljen Mikic explains, the divisor counting function is determined by the prime factorisation. To calculate n, start at 1 and use a greedy algorithm to double the number of divisors k times, choosing the cheapest factor at each step. The initial costs are the prime numbers, replaced by their square when you use them. After precomputing the first k prime numbers, you can do this quickly with a min-heap. In Python

    import primesieve # pip install primesieve
    import heapq
    
    def solve(k, modulus=None):
        """Calculate the smallest number with 2**k divisors."""
        n = 1
    
        costs = primesieve.generate_n_primes(k) # more than necessary
    
        for i in range(k):
            cost = heapq.heappop(costs)
            heapq.heappush(costs, cost**2)
            n *= cost
            if modulus:
                n %= modulus
    
        return n
    
    assert solve(4) == 120
    
    if __name__ == "__main__":
        print(solve(500500, 500500507))
    

提交回复
热议问题