Leetcode Link: 1175. 质数排列 - 力扣(LeetCode)
题目
请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。
让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。
由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。

解法一
思路: 实际上就是质数只放在质数索引的位置,合数放在合数索引的位置。
这样,最终就是两个排列的乘积 所有质数的排列情况数x所有合数排列情况组合
由于题目n<100,所以可以打表提前把质数都写出来。
题解:
class Solution:
def numPrimeArrangements(self, n: int) -> int:
# 所有质数打表,最后一个要超过100,否则99无法找到质数的数量
all_100 = [2, 3, 5, 7,11,13, 17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101]
# 找到小于n的所有质数的数量
for i, val in enumerate(all_100):
if n < val:
nums_zhi = i
break
nums_he = n - i
res = (self.jiecheng(nums_zhi) * self.jiecheng(nums_he)) % (10**9+7)
return res
# 排列组合数
def jiecheng(self, m):
ans = 1
while(m>1):
ans *= m
m -= 1
return ans