首页 > 试题广场 >

素数对

[编程题]素数对
  • 热度指数:710 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请你找出满足,且均小于等于的素数三元组  的数量。
素数三元组:A,B,C都是素数。

输入描述:
输入的第一行给出正整数
{1 \leq N \leq 5 \times 10^5}


输出描述:
一行中输出答案。
示例1

输入

8

输出

3

说明

{2,2,2}
{7,2,3}
{2,7,3}
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;
    }
}

发表于 2025-04-06 12:48:54 回复(0)