Description

Return the number of permutations of 1 to n so that prime numbers are at prime indices (1-indexed.)

(Recall that an integer is prime if and only if it is greater than 1, and cannot be written as a product of two positive integers both smaller than it.)

Since the answer may be large, return the answer modulo 10^9 + 7.

Example 1:

  • Input: n = 5
  • Output: 12
  • Explanation: For example [1,2,5,4,3] is a valid permutation, but [5,2,3,4,1] is not because the prime number 5 is at index 1.

Example 2:

  • Input: n = 100
  • Output: 682289015

Constraints:

  • 1 <= n <= 100

💡 Hint 1:
Solve the problem for prime numbers and composite numbers separately.

💡 Hint 2:
Multiply the number of permutations of prime numbers over prime indices with the number of permutations of composite numbers over composite indices.

💡 Hint 3:
The number of permutations equals the factorial.

Submitted Code

class Solution:
    def numPrimeArrangements(self, n: int) -> int:
        prime_nums = 0

        for num in range(1, n+1):
            if self.is_prime(num):
                prime_nums += 1
        
        permutations = math.factorial(prime_nums) * math.factorial(n-prime_nums)
        return permutations % (10**9 + 7)


    def is_prime(self, num: int) -> bool:
        if num <= 1:
            return False
        for i in range(2, int(math.sqrt(num))+1):
            if num % i == 0:
                return False
        return True

Runtime: 1 ms | Beats 27.72%
Memory: 17.28 MB | Beats 96.30%

1부터 n까지 숫자 모두를 소수인지 판별하기 때문에 속도가 상대적으로 느리게 나왔다.

Other Solutions

1st

class Solution:
    def numPrimeArrangements(self, n: int) -> int:
        primes = [True] * (n + 1)
        for prime in range(2, int(math.sqrt(n)) + 1):
            if primes[prime]:
                for composite in range(prime * prime, n + 1, prime):  # 소수의 배수들은 모두 소수
                    primes[composite] = False
        cnt = sum(primes[2:])                                         # 소수 개수 카운트
        return math.factorial(cnt) * math.factorial(n - cnt) % (10**9 + 7)

time complexity: 𝑂(𝑛*log(log𝑛))
space complexity: 𝑂(𝑛)

에라토스테네스의 체 방법을 사용하면 소수를 훨씬 빠르게 찾을 수 있다.

Leave a comment