LeetCode每日一题——1175. 质数排列

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

题目

请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 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

思路

质数和非质数分别对应相应的坐标,需要保证质数位上都是质数、非质数位上都是非质数,对质数和非质数分开求排列最后相乘即可。具体做法是:

  • 先求所有的质数个数
  • 数量为n的数列排列数目为n的阶乘
  • 求出质数排列与非质数排列相乘

题解

class Solution:
    def numPrimeArrangements(self, n: int) -> int:
        temp = 0
        # 求出质数个数
        for i in range(2, n+1):
            judge = True
            for j in range(2, floor(sqrt(i))+1):
                if i % j == 0:
                    judge = False
                    break
            if judge:
                temp += 1
        # 求质数与非质数排列的乘积
        sum = 1
        for i in range(1, temp+1):
            sum *= i
        for i in range(1, n-temp+1):
            sum *= i
        return sum % (10 ** 9 + 7)
目录
相关文章
|
7月前
|
测试技术
leetcode-1592:重新排列单词间的空格
leetcode-1592:重新排列单词间的空格
47 0
|
2月前
|
算法 C++ 容器
Leetcode第三十一题(下一个排列)
这篇文章介绍了LeetCode第31题“下一个排列”的C++解决方案,该算法通过原地修改数组来找到下一个字典序更大的排列,如果不存在则重排为字典序最小的排列。
31 0
Leetcode第三十一题(下一个排列)
|
6月前
|
存储 算法 数据挖掘
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
55 0
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
|
6月前
|
存储 算法 数据挖掘
LeetCode 题目 31:下一个排列【python】
LeetCode 题目 31:下一个排列【python】
|
7月前
|
JavaScript
【leetcode】204. 计数质数 暴力 & 埃拉托斯特尼法
【leetcode】204. 计数质数 暴力 & 埃拉托斯特尼法
40 0
|
7月前
|
容器
leetcode-31:下一个排列
leetcode-31:下一个排列
53 1
|
7月前
|
Go
golang力扣leetcode 937.重新排列日志文件
golang力扣leetcode 937.重新排列日志文件
52 0