leetcode5173.质数排列


先来道leetcode题目指路:

leetcode5173.质数排列

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


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

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



输入:n = 5

输出:12

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


答案倒是好想,贴一下js代码:

var numPrimeArrangements = function(n) {
    let baseNum = Math.pow(10,9) + 7;
    let nums = new Array(n+1).fill(0);
    
    if(n <= 2){ return 1; }
    
    nums[2] = 1;
    
    let PrimeNum = function(i){//为了求出[0-i]中质数个数
        for(let j = 2;j < i ;j++){
            if(i % j === 0){
                nums[i] = nums[i-1];
                return ;
            }
        }
        nums[i] = nums[i-1] + 1;
    }
    
   let vec = new Array(n).fill(1);//为了求出i的全排列
    for(let i = 2;i<n ;i++){
        vec[i] = vec[i-1]*i%baseNum;
    }
    
    for(let i = 3 ; i <= n; i++){
        PrimeNum(i);
    }
    
    return ( vec[nums[n]]*vec[n - nums[n]] ) % baseNum;//全排列乘积
};

但是,挂了emmm



js 中有最大安全数,精度位数是 53bit。 安全数的意思是在-2^53 ~ 2^53内的整数(不包括边界)

参考链接:

  1. JavaScript 浮点数陷阱及解法 (大赞)
  2. JavaScript 里最大的安全的整数为什么是2的53次方减一?