游游想知道,有多少个长度为
的排列满足任意两个相邻元素之和都不是素数。你能帮帮她吗?
我们定义,长度为
的排列值一个长度为
的数组,其中1到
每个元素恰好出现了一次。
# Pypy3 prime = set([2, 3, 5, 7, 11, 13, 17, 19]) n = int(input()) ans = 0 path = [0] * n on_path = [True] * (n + 1) def dfs(i): if i == n: global ans ans += 1 return for x in range(1, n + 1): if not i&nbs***bsp;(on_path[x] and x + path[i - 1] not in prime): on_path[x] = False path[i] = x dfs(i + 1) on_path[x] = True dfs(0) print(ans)
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { private static int[] path; private static boolean[] visited; // visited[i]表示数字i是否被使用过 private static int n; private static int ans; private static void dfs(int i) { if (i == n) { ans++; return; } for (int j = 1; j <= n; j++) { if (!visited[j]) { if (i > 0) { if (!isPrime(path[i - 1] + j)) { visited[j] = true; path[i] = j; dfs(i + 1); visited[j] = false; } } else { visited[j] = true; path[i] = j; dfs(i + 1); visited[j] = false; } } } } private static boolean isPrime(int num) { for (int i = 2; i <= Math.sqrt(num); i++) { if (num % i == 0) { return false; } } return true; } public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case n = in.nextInt(); path = new int[n]; visited = new boolean[n + 1]; dfs(0); System.out.println(ans); } } }
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static List<List<Integer>> res = new ArrayList<>(); public static Deque<Integer> path = new LinkedList<>(); public static boolean[] used; public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); used = new boolean[n + 1]; for (List<Integer> list : res) { System.out.print(list.toString()); System.out.println(); } dfs(n); System.out.println(res.size()); } public static void dfs(int n) { if (path.size() == n) { res.add(new ArrayList<>(path)); return; } for (int i = 1; i <= n; i++) { if (used[i]) continue; if (!path.isEmpty() && isPrime(i + path.getLast())) continue; path.add(i); used[i] = true; dfs(n); used[i] = false; path.removeLast(); } } public static boolean isPrime(int num) { if (num <= 1) return false; if (num <= 3) return true; if (num % 2 == 0 || num % 3 == 0) return false; for (int i = 5; i * i <= num; i += 6) { if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } }