首页 > 试题广场 >

素数对

[编程题]素数对
  • 热度指数:708 时间限制: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)
importsys
 
forline in sys.stdin:
    a = line.split()
    N = int(a[0])
    ifN < 2:
        print(0)
    else:
        # 埃拉托斯特尼筛法生成素数列表
        is_prime = [True] * (N + 1)
        is_prime[0] = is_prime[1] = False
        fori in range(2, int(N**0.5) + 1):
            ifis_prime[i]:
                forj in range(i * i, N + 1, i):
                    is_prime[j] = False
 
        # 初始化素数三元组的数量
        count = 0
 
        # 处理 C = 2的情况
        ifis_prime[2]:
            if2* 2<= 2* N:
                ifis_prime[2]:
                    count += 1
 
        # 处理 C 为奇数素数的情况
        forC in range(3, N + 1, 2):
            ifis_prime[C]:
                square_C = C * C
                ifsquare_C > 2* N:
                    break
                # 考虑 A = 2的情况
                B = square_C - 2
                ifB <= N and is_prime[B]:
                    count += 2
 
        # 输出结果
        print(count)
发表于 2025-04-12 17:02:55 回复(0)