区间内素数的个数(也要用到埃氏算法)
题目大意:给定正整数a和b,请问区间[a,b)内有多少个素数
限制条件:a<b<=10^12 b-a<=10^6
样例:
22 37 3
22801763489 22801787297 1000
思路:由于b以内的合数的最小质因数一定不超过根号b,所以如果有根号b以内的素数表的话,就可以用埃氏算法运用在[a,b)上了。 也就是说,先分别做好[2,根号b)的表和[a,b)的表,
然后从[2,根号b)的表中筛得素数的同时,也将其倍数从[a,b)的表中划去,最后剩下的就是[a,b)以内的素数了。
看代码
#include<iostream> #include<string.h> #include<map> #include<cstdio> #include<cstring> #include<stdio.h> #include<cmath> #include<math.h> #include<algorithm> #include<set> #include<queue> typedef long long ll; using namespace std; const ll mod=1e9+7; const int maxn=1e6+10; const int maxk=5e3+10; const int maxx=1e4+10; const ll maxe=1000+10; #define INF 0x3f3f3f3f3f3f #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 ll l,r; bool is_prime[maxn],is_prime_small[maxn]; void solve() {ll sum=0;for(ll i=0;i*i<r;i++) is_prime_small[i]=false;for(ll i=0;i<r-l;i++) is_prime[i]=false;//题目给的范围太大,根本不可能开出那么大的数组,所以用r-l来存储for(ll i=2;i*i<r;i++){if(!is_prime_small[i]){for(ll j=2*i;j*j<r;j+=i) is_prime_small[j]=true;//筛选[2,根号b)的表for(ll j=max(i*2ll,l%i==0?l:(l/i+1)*i);j<r;j+=i)//为何是max(i*2ll,l%i==0?l:(l/i+1)*i),因为可能是第一个i*2,也有可能是后面的i*n*2,这就看l的值了 {if(!is_prime[j-l]){is_prime[j-l]=true;// cout<<j<<" ";sum++;}}}}// cout<<endl;if(l==1) sum++;//注意这里需要特判1if(l==0) { if(r==1) sum+=1; else sum+=2;//特判0 } cout<<r-l-sum<<endl; } int main() {cin>>l>>r;solve();return 0; }
转载于:https://www.cnblogs.com/caijiaming/p/9429868.html
区间内素数的个数(也要用到埃氏算法)相关推荐
- 统计素数并求和 (20 分)本题要求统计给定整数M和N区间内素数的个数并对它们求和。
本题要求统计给定整数M和N区间内素数的个数并对它们求和. 输入格式: 输入在一行中给出两个正整数M和N(1≤M≤N≤500). 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以 ...
- 要求统计给定整数M和N区间内素数的个数,并对所有素数求和。
题目内容: 要求统计给定整数M和N区间内素数的个数,并对所有素数求和. 其中两数必须满足条件: . 如果输入的M和N不能满足以上条件,则提示"输入数据错误". 输入格式: 在一行中 ...
- 本题要求统计给定整数M和N区间内素数的个数并对它们求和。
本题要求统计给定整数M和N区间内素数的个数并对它们求和. 输入格式: 输入在一行中给出两个正整数M和N(1≤M≤N≤500). 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以 ...
- python acm 素数个数_湘潭大学OJ-1098求区间内素数个数问题
求区间内素数个数问题 题目描述 Description 给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数.限制:Time Limit : 1 ...
- 计算机frequency函数,第二章 FREQUENCY函数按条件统计给定区间内的数据个数
第二章 FREQUENCY函数按条件统计给定区间内的数据个数 作者:李锐(微博@Excel_函数与公式)微信公众号(ExcelLiRui) FREQUENCY函数不但可以对数据进行多段区间的个数统计, ...
- 三种素数筛总结——(朴素筛,埃氏筛,线性筛)
但行好事,莫问前程. 题目背景 题目:(leetcode)204.计数质数 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 . 对于这类求解素数个数有关的题目,通常采用质数筛算法. 本文不计 ...
- MPI实现求解10的八次方内素数的个数(版本一)
使用MPI计算素数个数 算法实现所使用的方法: 当所要计算的个数达到10的8次方,甚至更多时,一台机器很难胜任这份工作. 使用MPI分布式并行计算可以实现这个目标,原来一个人干的事情现在让很多个人来干 ...
- 本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
其中函数prime当用户传入参数p为素数时返回1,否则返回0:函数PrimeSum返回区间[m, n]内所有素数的和.题目保证用户传入的参数m≤n. 裁判测试程序样例: #include <st ...
- Python实验项目1例:使用进程池统计指定范围内素数的个数
本周赠书活动:董付国老师Python系列教材赠书活动(40本) -------------------------------- 适用专业: 适用于计算机.网络工程.软件工程等相关专业,其他专业选做. ...
最新文章
- poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★
- OAF TABLE中添加序号列
- 来自艾斯维尔的计算机科学系的期刊排行,研究生必备!
- DataGrip导入csv数据并把第一行作为列名
- 前端学习(3302):类组件父组件和子组件createRef
- 函数的结束条件和返回值 — return
- 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析
- Bootstrap 重置样式
- bzoj3203 [Sdoi2013]保护出题人 凸包+二分
- HashMap解决hash冲突
- JConsole使用教程
- 春节假期最值得阅读的10本书
- 计算机的供电方式,电脑主板电源供电方式
- matlab/simulink鼠标滚动设置成上下移动而不是缩放
- linux 缩小硬盘镜像,缩小qcow2格式kvm虚拟镜像磁盘大小[转]
- 【Python系列】Python写csv文件长数字变成科学记数法的解决方案
- 《认知天性》这本书对我的启发,以及我在日常中的应用
- Calendar类(日历)
- C语言——选择控制结构 寻找中位数v1.0编写一个函数返回三个整数中的中间数。函数原型:int mid(int a, int b, int c);功能是返回a,b,c三数中大小位于中间的一个数。
- unicode字符范围(包括中文、日语、韩文和各种特殊字符集)