请你找出满足
,且
均小于等于
的素数三元组
的数量。
素数三元组:A,B,C都是素数。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
List<Integer> list = new ArrayList<>(); // 素数表
Set<Integer> set = new HashSet<>(); // 加快第三个数的查找
for (int i = 1; i <= n; i++) {
if (prime(i)) {
list.add(i);
set.add(i);
}
}
int m = list.size(), res = 0;
for (int i = 0; i < m; i++) { // 取AC/BC减少选择范围:
for (int j = i; j < m; j++) { // C>=A
int a = list.get(i), c = list.get(j);
int b = c * c - a;
if (b > list.get(m - 1)) break; // C*C-A=B<=MAX
if (set.contains(b)) {
if (a != b) res += 2; // AB、BA
else res++;
}
}
}
System.out.println(res);
}
// 判断素数
private static boolean prime(int n) {
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
// 1. 筛素数
boolean[] isPrime = new boolean[N + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= N; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= N; j += i) {
isPrime[j] = false;
}
}
}
// 收集素数列表
List<Integer> primes = new ArrayList<>();
for (int i = 2; i <= N; i++) {
if (isPrime[i]) primes.add(i);
}
int count = 0;
// 2. 枚举 C
for (int C : primes) {
long target = (long) C * C;
if (target > 2L * N) break; // A+B = target, A,B ≤ N ⇒ target ≤ 2N
// 3. 枚举 A
for (int A : primes) {
if (A > target) break;
int B = (int) (target - A);
if (B >= 2 && B <= N && isPrime[B]) {
count++;
}
}
}
System.out.println(count);
}
}