游游的排列统计(携程24秋招研发岗第一批)

题面

核心思想

素数筛先预处理出20以内的素数
然后用全排列的思想去做就好了,就是多了个判断。

代码

import java.util.*;

public class Main {
    static final int MAXN = (int) (21);
    static int[] isNotPrime = new int[21];
    static int[] v = new int[11];
    static List<Integer> cur = new ArrayList<>();
    static int res = 0;
    public static void main(String[] args) {
        final long MOD = (long) (1e9 + 7);

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        //欧拉筛 MAXN = 21
        List<Integer> primes = new ArrayList<>();
        for(int i = 2; i < MAXN; i++){
            if(isNotPrime[i] == 0)
                primes.add(i);
            for(int num: primes){
                if(i * num >= MAXN)
                    break;
                isNotPrime[i * num] = 1;
                if(i % num == 0)
                    break;
            }
        }

        helper(n);

        System.out.println(res);
    }

    static void helper(int n){
        if(cur.size() == n){
           res ++;
        }
        for(int i = 1; i <= n; i++){
            if(v[i] == 1) // 访问标记
                continue;
            // 是空 或者 当前选择的 i 加上 最后一个数 不是素数
            if(cur.isEmpty() || isNotPrime[i + cur.get(cur.size() - 1)] == 1){
                cur.add(i);
                v[i] = 1;
                helper(n);
                cur.remove(cur.size() - 1);
                v[i] = 0;
            }
        }
    }

}
posted @ 2024-04-12 10:16  Shie1d  阅读(111)  评论(0)    收藏  举报