跳转至

1175. 质数排列#

问题描述#

请你帮忙给从 1n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。

让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。

由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。

 

示例 1:

输入:n = 5
输出:12
解释:举个例子,[1,2,5,4,3] 是一个有效的排列,但 [5,2,3,4,1] 不是,因为在第二种情况里质数 5 被错误地放在索引为 1 的位置上。

示例 2:

输入:n = 100
输出:682289015

 

提示:

  • 1 <= n <= 100

解题思路#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution:
    def numPrimeArrangements(self, n: int) -> int:
        # def num_primes(n: int) -> int:
        #     is_prime = [True] * (n + 1)
        #     primes = []
        #     for i in range(2, n + 1):
        #         if is_prime[i]:
        #             primes.append(i)
        #         for prime in primes:
        #             x = i * prime
        #             if x > n:
        #                 break
        #             is_prime[x] = False
        #             if i % prime == 0:
        #                 break
        #     return sum(is_prime[2:])

        def num_primes(n: int)->int:
            is_prime = [True] * (n + 1)
            i = 2
            while i * i <= n:
                if is_prime[i]:
                    is_prime[i * i : n + 1 : i] = [False] * len(
                        range(i * i, n + 1, i)
                    )
                i += 1
            return sum(is_prime[2:])

        a = num_primes(n)
        ans = 1
        MOD = 10 ** 9 + 7
        for i in range(1, a + 1):
            ans = (ans * i) % MOD
        for i in range(1, n - a + 1):
            ans = (ans * i) % MOD
        return ans
返回顶部

在手机上阅读