方法一 数学规律
其实题目的意思就是1-n里面本来是质数的位置只能放质数,非质数的位置只能放非质数,那么就把质数和非质数的排列分开考虑,假设有x个质数,根据数学的排列规律,那么这么质数的排列方案?数量为x的阶乘,同理非质数的排列为(n-x)的阶乘
所以这道题就是求质数的个数然后求两个阶乘的积
但是要注意对10^9+7取模,且应该是循环求阶乘时对每次循环的结果取模,不能只用最后的阶乘取模
const mod = 1000000007;
var numPrimeArrangements = function(n) {
var prime=0,res=1
for(let i=2;i<=n;i++){
if(isPrime(i)){
prime++
}
}
console.log(prime)
var composite=n-prime
while (prime > 0) {
res = res % mod;
res *= prime;
prime--;
}
while (composite > 0) {
res = res % mod;
res *= composite;
composite--;
}
return res
};
function isPrime(n) {
if (n === 1) {
return false;
}
for (let i = 2; i * i <= n; i++) {
if (n % i === 0) {
return false;
}
}
return true;
}
消耗时间和内存情况: