LeetCode力扣每日一题1175. 质数排列

请你帮忙给从 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

提示:

1 <= n <= 100

思路

  • 质数之间位置可以互换,非质数和非质数之间也可以互换
  • 若质数有x个,则有x!种排列;非质数有y个,则有y!中排列;则共有x!*y!种排列
  • 注意
    • 每一步计算都要取模
    • 用long long 定义中间变量
    • 最后返回的结果也别忘记取模
#include "bits/stdc++.h"
using namespace std;

int MOD = 1e9 + 7;
int MAXN = 100;

class Solution {
    
    
public:
    void getPrime() {
    
    
        isPrime.resize(MAXN + 1, true);
        isPrime[0] = isPrime[1] = false;
        for (int i = 2; i <= MAXN; ++i) {
    
    
            if (isPrime[i]) {
    
    
                for (int j = 2 * i; j <= MAXN; j += i) {
    
    
                    isPrime[j] = false;
                }
            }
        }
    }

    int numPrimeArrangements(int n) {
    
    
        if (n == 1) {
    
    
            return 1;
        }
        getPrime();
        // 质数之间位置可以互换,非质数和非质数之间也可以互换
        // 若质数有x个,则有x!种排列;非质数有y个,则有y!中排列;则共有x!*y!种排列
        long long x = 0;
        for (int i = 1; i <= n; ++i) {
    
    
            if (isPrime[i]) {
    
    
                ++x;
            }
        }
        long long y = n - x;
        for (int i = x - 1; i >= 2; --i) {
    
    
            x = (x * i) % MOD;
        } 
        for (int i = y - 1; i >= 2; --i) {
    
    
            y = (y * i) % MOD;
        }
        return (x * y) % MOD;
    }

private:
    vector<bool> isPrime;
};
  • 素数筛法
    用筛法求素数的基本思想:
    若A(A>=2)为素数,则A的N(N>=2)倍数一定不是素数。
    C
    ++代码:
// 初始化为true
vector<int> isPrime(range + 1, true);
// 0和1都不是素数
isPrime[0] = isPrime[1] = false;
// 从2开始,将非素数设置为false
for (int i = 2; i <= range; ++i) {
    
    
	if (isPrime[i]) {
    
    
		for (int j = 2 * i; j <= range; j += i) {
    
    
			isPrime[j] = false;
		}
	}
}

优化:

猜你喜欢

转载自blog.csdn.net/weixin_36313227/article/details/125535743