当前位置: 首页 > news >正文

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

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) {
			//标记非质数为 1
			for (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) {
			//标记非质数为 1
			for (int j = i * i; j <= N; j += i)
				isprime[j] = 1;
			//这一步为埃拉托斯特尼筛法的核心步骤!单独见分析
		}
	}
	//收集所有质数到prime
	int 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^2
		if (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;
}

相关文章:

  • 【uniapp】在UniApp中实现持久化存储:安卓--导出数据为jsontxt
  • 【全干货】cocos简短demo制作-三消类游戏
  • 测试的BUG分析
  • 第二十九:5.7.【$subscribe】侦听数据
  • SpringBoot集成easy-captcha图片验证码框架
  • 《Somewhat Practical Fully Homomorphic Encryption》笔记 (BFV 源于这篇文章)
  • 前端Javascrip后端Net6前后分离文件上传案例(完整源代码)下载
  • 2025 最新版鸿蒙 HarmonyOS 开发工具安装使用指南
  • Go入门之文件
  • 华为AP 4050DN-HD的FIT AP模式改为FAT AP,家用FAT基本配置
  • 练习题:57
  • JDBC 进阶(未完结)
  • C# 确保程序只有一个实例运行
  • 如何确保邮件内容符合不同地区用户的文化习惯
  • 原子性(Atomicity)和一致性(Consistency)的区别?
  • 【备份】php项目处理跨域请求踩坑
  • 【JavaSE-2】数据类型与变量
  • Jmeter接口自动化测试读取用例
  • 快速理解Spring 和 Spring Boot 的核心区别
  • 易错点abc
  • 荣盛发展:新增未支付债务11.05亿元
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 哈马斯官员:若实现永久停火,可交出加沙地带控制权
  • 杞支雅男评《1517》|放眼世界,立足德国
  • 六连板成飞集成:航空零部件业务收入占比为1.74%,市场环境没有重大调整
  • 西北大学副校长成陕西首富?旗下巨子生物去年净利超20亿,到底持股多少