质数排列

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

  • 输入:n = 5

  • 输出:12

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

  • 输入:n = 100

  • 输出:682289015

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
var numPrimeArrangements = function(n) {
let count = 1, pcount = 1;
const dp = new Array(n+1).fill(0)
dp[1] = 1;
dp[2] = 1;
const mod = 1e9 + 7;
for (let i = 3; i <= n; i++) {
if (isPrime(i)) {
pcount++;
dp[i] = (dp[i-1] * pcount) % mod;
} else {
count++;
dp[i] = (dp[i-1] * count) % mod;
}
}
return dp[n];
};

const isPrime = (n) => {
if (n === 1) return false;
let max = Math.floor(Math.sqrt(n));
for (let i = max; i >= 2; i--) {
if (n % i === 0) {
return false;
}
}
return true;
}