JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2023-02-13
目录

质数排列Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

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

# 思路

筛选法求质数,剩下排列相乘就行

# 解法


class Solution {
    // 筛选法求质数,剩下排列相乘就行


    public int numPrimeArrangements(int n) {

        boolean[] flag = new boolean[n+1];
        int mod = (int)1e9+7;
        for (int i = 2; i < n+1; i++) {
            if(flag[i])continue;
            for (int j = 2; i*j < n+1; j++) {
                flag[i*j] = true;
            }
        }
        int u = 0;
        for (int i = 2; i < n+1; i++) {
            if(!flag[i])u++;
        }
        long res = 1;
        for (int i = 1; i <= u; i++) {
            res = (res*i)%mod;
        }
        for (int i = 1; i <= n-u; i++) {
            res = (res*i)%mod;
        }
        return (int) res;
    }
}
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

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式