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

【2024.9.30练习】素数密度

题目描述


题目分析

由于是区间内筛选素数,考虑用埃氏筛法。总区间长度为2^{31}\approx 10^{9},埃筛的长度即为\sqrt{10^{9}}

注意这里的L-R\leq 10^{6},这说明区间内的数字最多有10^6+1个。


我的代码

一开始使用的int类型,但是即便数据都在Int范围内,但由于R的值太接近Int边界,在判定i*i是否大于R等乘法表达式时很可能造成溢出,因此区间筛法尽量还是使用long long存储数据。

另外一个难点是筛选区间[L,R]的素数时,变量j的起点值为( max(2,\left \lfloor L+i-1)/i \right \rfloor))\times i。初见很难推导出来。

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int MAX_N = 1000005;
int is_p[MAX_N];	//2到根号R区间
int is_p_ans[MAX_N];	//L到R区间int main() {//初始化ll L;ll R;cin >> L >> R;for (ll i = 0; i < MAX_N; i++){is_p_ans[i] = 1;is_p[i] = 1;}//max_i=根号R(向下取整)ll max_i;for (ll i = 1; (ll)i * i <= R; i++){max_i = i; }//cout << max_i << endl;//埃筛for (ll i = 2; i <= max_i; i++){if (is_p[i] == 1) {for (ll j = i * 2; j <= max_i; j += i){is_p[j] = 0;	//筛[2,√R]}for (ll j = max(2LL, (L + i - 1) / i) * i; j <= R; j += i) {is_p_ans[j - L] = 0;	//筛[L,R]}}}//统计int ans = 0;for (int i = 0; i <= R-L; i++){if (is_p_ans[i] == 1) {cout << i + L << endl;ans++;}}if (L == 1) {ans--;}cout << ans;return 0;
}


http://www.mrgr.cn/news/39752.html

相关文章:

  • 阿里云表格存储OtsQueryWrapper
  • Nginx部署前端Vue项目的深度解析
  • 学习高级深度学习的必备书——深度学习精粹
  • 银行家的舍入方法探讨20240930
  • [linux 驱动]input输入子系统详解与实战
  • python实用脚本(二):删除xml标签下的指定类别
  • 基于yolov8的100种蝴蝶智能识别系统python源码+pt模型+训练日志+精美GUI界面
  • 在PC端连接苹果手机(iPhone)时,即使已经开启了开发者模式(开发者权限),但仍然无法成功连接,是什么原因?
  • 特征工程——一门提高机器学习性能的艺术
  • 【LeetCode】动态规划—5. 最长回文子串(附完整Python/C++代码)
  • JDBC进阶
  • 【vs code(cursor) ssh连不上服务器(2)】但是 Terminal 可以连上,问题解决 ✅
  • C#名片识别接口集成方式、文字识别API
  • C++ STL(1)迭代器
  • 微信小程序 图片的上传
  • InnerClassLambdaMetafactory 内部类Lambda元工厂 源码解析
  • [Cocoa]_[初级]_[绘制文本如何设置断行方式]
  • 内核级理解套接字和全连接队列
  • 物联网智能设备:未来生活的变革者
  • centos发送邮件教程:从配置到发送全攻略!