P9420 [蓝桥杯 2023 国 B] 双子数--最高效的质数筛【埃拉托斯特尼筛法】

server/2025/2/28 11:28:49/

P9420 [蓝桥杯 2023 国 B] 双子数

      • 题目
  • 分析
      • 代码

题目

在这里插入图片描述

分析

首先,我们如何找到双子数?

1)找到所有质数满足范围内的质数(即至少质数^2<=23333333333333)

我们看见双子数x的范围2333<=x<=23333333333333,又因为
x = p² × q²,所以 p 和 q 的取值不能太大。代码中筛选出所有小于等于 5,000,000 的质数(这个范围足够覆盖所有可能的组合)。
2)遍历质数对
对于每一对不同的质数 p 和 q(假设 p < q),计算 p² × q²,检查是否在目标区间内。

最后我再介绍一下
介绍一下最高效的质数筛【埃拉托斯特尼筛法】

for (int i = 2; i <= sqrt(N); i++) {if (isprime[i] == 0) {//标记非质数为 1for (int j = i * i; j <= N; j += i)isprime[j] = 1;//这一步为埃拉托斯特尼筛法的核心步骤!}}

首先定义一个数组isprime[i]用于标记i是否为质数,不同的是,将非质数标记为1

为什么从i*i开始遍历
比i * i 更小的 i 的倍数(例如 2* i、3* i、…、(i-1)* i)已经被之前更小的质数标记过了。例如:

当 i=5 时,25=10 已经被 i=2 循环时标记。
3
5=15 已经被 i=3 循环时标记。
所以第一个未被标记的 i 的倍数是 i*i=25。

为什么j+=i而不是j++?
这一步的目的是按步长 i 递增,标记所有 i 的倍数

具体例子(以 i=5 为例)
初始时:i=5(且 i 是质数)。
标记起点:j = 5*5 = 25。
标记过程:
标记 25 为非质数 → j += 5 → 30。
标记 30 为非质数 → j += 5 → 35。
依此类推,直到 j 超过 N。

时间复杂度是 O(n log log n),是效率最高的质数筛选算法之一!

代码

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <math.h>
#include <queue>#include <cctype>
using namespace std;
const int N = 5e6;
//为什么是5X10^6,因为x=p^2+q^2,当p=5e6已经能覆盖所有可能的x范围;
int isprime[N];int prime[N];
int main() {//开始筛2~N中的质数【递推实现】for (int i = 2; i <= sqrt(N); i++) {if (isprime[i] == 0) {//标记非质数为 1for (int j = i * i; j <= N; j += i)isprime[j] = 1;//这一步为埃拉托斯特尼筛法的核心步骤!单独见分析}}//收集所有质数到primeint cnt = 0;for (int i = 2; i <= N; i++) {if (isprime[i] != 1)prime[cnt++] = i;}int ans = 0;for (int i = 0; i < cnt; i++) {long long p2 = 1LL * prime[i] * prime[i]; //计算p^2if (p2 * p2 > 23333333333333)break;for (int j = i + 1; j < cnt; j++) {long long q2 = 1LL * prime[j] * prime[j];long long temp = q2 * p2;if (temp < 2333)continue;//结果小了,跳过本次循环,接着往后遍历if (temp > 23333333333333)break;//结果打了,已经找到头了,终止循环ans++;//如果满足2333<=temp<=23333333333333,则记录答案}}cout << ans << endl;return 0;
}

http://www.ppmy.cn/server/171280.html

相关文章

大模型系列——专家混合模型 (MoE)快速指南

大模型系列——专家混合模型 (MoE)快速指南 专家混合 (MoE) 已成为一种流行的提高 LLM 效率的架构组件。在这篇博文中,我们将探讨研究人员在实现专家完美混合的道路上所采取的步骤。 专家混合 (MoE) 已成为一种流行的提高 LLM 效率的架构组件。在这篇博文中,我们将探讨研究人…

常用的HTML meta标签有哪些

meta是 HTML 中的一个元数据标签&#xff0c;位于 <head> 标签内&#xff0c;不会在页面上直接显示&#xff0c;但能为浏览器和搜索引擎提供关于网页的重要信息。以下是一些常用的 <meta> 标签及其用途&#xff1a; 1. 字符编码声明 用于指定 HTML 文档的字符编码…

深度学习实战:使用TensorFlow构建卷积神经网络(CNN)

在前两篇文章中&#xff0c;我们从零开始构建了简单的神经网络&#xff0c;并逐步扩展到多层神经网络。这些网络在处理简单的数据集&#xff08;如鸢尾花数据集&#xff09;时表现出色。然而&#xff0c;对于更复杂的任务&#xff0c;如图像分类&#xff0c;我们需要更强大的模…

Python代码片段-断点任务

使用Python处理一堆长耗时任务的时候&#xff0c;为了防止异常退出程序或者手动退出程序后丢失任务进度&#xff0c;可用使用断点的方式记录任务进度&#xff0c;下次重载任务后&#xff0c;继续运行上次未完成的任务即可。 这里用json文件作为数据持久化的方式&#xff0c;免…

信号在linux内核的表示

在Linux内核中&#xff0c;信号的表示和处理机制是进程间通信和进程控制的重要组成部分。以下是信号在Linux内核中的表示及相关机制的详细说明&#xff1a; 1. 信号在内核中的表示 在Linux内核中&#xff0c;每个信号有三个关键属性&#xff1a; 阻塞标志&#xff08;Block&…

使用 Polars 进行人工智能医疗数据分析(ICU数据基本测试篇)

引言 在医疗领域&#xff0c;数据就是生命的密码&#xff0c;每一个数据点都可能蕴含着拯救生命的关键信息。特别是在 ICU 这样的重症监护场景中&#xff0c;医生需要实时、准确地了解患者的病情变化&#xff0c;以便做出及时有效的治疗决策。而随着医疗技术的飞速发展&#x…

变换队列c++

题目描述 班上的同学们每个人都有各自的学号d(1≤d≤100) &#xff0c;每个同学的学号各不相同。 所以学号可以用来唯一标识班上的某个同学。 假设有个班有五名同学&#xff08;学号分别为 1、2、3、4、5 &#xff09;&#xff0c;他们排了两次队&#xff0c; 第一次排队的…

Docker 部署 Spring Cloud 项目:实战指南与经验分享

一、引言 在当今的微服务架构开发中&#xff0c;Spring Cloud 凭借其丰富的组件和强大的功能&#xff0c;成为了构建分布式系统的热门选择。而 Docker 作为一种轻量级的容器化技术&#xff0c;能够实现应用的快速部署、隔离和迁移&#xff0c;极大地提高了开发和运维的效率。将…