题目: 小明正在参加魔法科的期末考试,考生需要根据给定的口诀组合出有效的魔法。其中,老师给定了 nn 个上半部分口诀 a1,a2,…,ana1,a2,…,an 和 mm 个下半部分口诀 b1,b2,…,bmb1,b2,…,bm,均用整数表示。完整的口诀包含一个上半部分口诀和一个下半部分口诀,当选用两个口诀 aiai 和 bjbj,将组合出完整口诀 S=ai+bjS=ai+bj。
当 S 满足 S≤n+mS≤n+m 且 SS为质数时,魔法是有效的。魔法的种类只和 SS的大小有关。如果每个上半部分口诀和每个下半部分口诀在不同的组合中可以重复使用,小明想知道一共可能组合出多少种不同的有效魔法? 代码: import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(), m = sc.nextInt(); int[] a = new int[n], b = new int[m]; for (int i = 0; i < n; i++) a[i] = sc.nextInt(); for (int i = 0; i < m; i++) b[i] = sc.nextInt(); boolean[] isPrime = new boolean[n + m + 1]; Arrays.fill(isPrime, true); isPrime[0] = isPrime[1] = false; for (int i = 2; i * i <= n + m; i++) if (isPrime[i]) for (int j = i * i; j <= n + m; j += i) isPrime[j] = false; Set set = new HashSet<>(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int s = a[i] + b[j]; if (s <= n + m && isPrime[s]) set.add(s); } } System.out.println(set.size()); } }