ZJNU 1223 - 素数距离——高级
因为最大可以达到int极限
明显直接筛选不可能完成
所以从其因子入手
因为任何不是素数的数都有除了1与其自身之外的因子
因此,我们筛出2^(31/2)≈46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除
然后将素数存放在prnum这个vector集合中便于调用
在排除阶段,可以用
l=((L+prnum[i]-1)/prnum[i])*prnum[i]
计算出区间内的第一个是prnum[i]的倍数的数
注意,如果计算出来的使其本身,取倍数
再用
r=R/prnum[i]*prnum[i]
计算出最后一个是prnum[i]的倍数的数
符合条件时,从l到r,每次加prnum[i],标记出所有以prnum[i]为因子的数
因为无法直接开数组标记到大数
但又因为R-L≤1000000
所以可以对位置进行转换
标记时取-L+1,取出时取-1+L
最后将区间内的素数取出放在ans这个vector集合内,对答案进行判断即可
(注意特殊情况的判断)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> prnum,ans;
bool prim[],ar[];
int main(){
ll L,R,i,j,cnt,l,r,mxdis,mndis,mxn1,mxn2,mnn1,mnn2,d;
scanf("%lld%lld",&L,&R);
memset(prim,true,sizeof prim);
prim[]=prim[]=false;
for(i=;i<=;i++)
if(prim[i])
for(j=*i;j<=;j+=i)
prim[j]=false;//埃氏筛法
prnum.push_back();
for(i=;i<=;i+=)
if(prim[i])
prnum.push_back(i);//将素数放置在prnum内
cnt=prnum.size();
memset(ar,true,sizeof ar);
if(L==)
ar[]=false;
for(i=;i<cnt;i++){
l=((L+prnum[i]-)/prnum[i])*prnum[i];
if(l==prnum[i])//如果计算得出的l恰好为第i个素数本身,跳过它,取其倍数
l+=l;
if(l>R)
continue;
r=R/prnum[i]*prnum[i];
for(j=l;j<=r;j+=prnum[i])
ar[j-L+]=false;//标记
}
for(i=;i<=R-L+;i++)
if(ar[i])
ans.push_back(i-+L);//将指定区间内的所有素数提出
cnt=ans.size();
if(cnt<)
puts("There are no adjacent primes.");
else{
mndis=mxdis=ans[]-ans[];
mxn1=mnn1=ans[];
mxn2=mnn2=ans[];
for(i=;i<cnt;i++){
d=ans[i]-ans[i-];
if(d>mxdis){
mxdis=d;
mxn1=ans[i-];
mxn2=ans[i];
}
if(d<mndis){
mndis=d;
mnn1=ans[i-];
mnn2=ans[i];
}
}
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",mnn1,mnn2,mxn1,mxn2);
} return ;
}
ZJNU 1223 - 素数距离——高级的更多相关文章
- nyoj 24 素数距离问题
素数距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度. ...
- 素数距离问题_ny_24.java
素数距离问题 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距 ...
- ny24 素数距离的问题 筛选法求素数
素数距离问题时间限制:3000 ms | 内存限制:65535 KB难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素 ...
- nyoj 素数距离
素数距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度 ...
- 水题(素数表)NYOJ素数距离
描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素数,则输出左侧的值及相应距离. 如果输入的整数本身就是素数,则输 ...
- ZJNU 1217 - 航线问题——高级
将所有航线的其中一边排序后,另一边进行类dp 定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值 比如下面一个样例 1 3 2 4 3 1 4 2 此时对 ...
- ZJNU 1205 - 侦探推理——高级
双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意 注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N (注意 ...
- NYOJ 24 素数的距离问题
素数的距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描写叙述 如今给出你一些数.要求你写出一个程序,输出这些整数相邻近期的素数,并输出其相距长度.假设左右有等距离长 ...
- CodeForces937B:Vile Grasshoppers(素数性质)
The weather is fine today and hence it's high time to climb the nearby pine and enjoy the landscape. ...
随机推荐
- 十三、react-router 4.x的基本配置
路由的定义及作用 根组件根据客户端不同的请求网址显示时,要卸载上一个组件,再挂载下一个组件,如果手动操作话将是一个巨大麻烦.具体过程如下图: [根组件] ↑ [首页组件] [新闻组件] [商品组件] ...
- Python抽象基类之声明协议
抽象基类之--声明协议 上回讲了Python中抽象基类的大概,相信大家对abcmeta以及什么是抽象基类已经有所了解.传送门 现在我们来讲讲抽象基类的另一个常用用法--声明协议 所谓声明协议,有点像J ...
- Beyond Compare 文件对比工具的使用
Beyond Compare 文件对比工具的使用 Beyond Compare 工具下载地址: http://www.onlinedown.net/soft/633850.htm 本文下载地址:E:\ ...
- git使用散记
1.从远程clone一个项目 git clone ‘项目地址’ //clone项目地 git checkout -b dev origin/dev //远程已有dev分支,新建本地dev分支与远程相对 ...
- 《Thinking in Java》位运算
按位操作符: 首先先记住一件事,方便理解:是否对应正负对应10. 1.与(&):11得1,10得0,00得0. 2.或(|):11得1,10得1,00得0. 3.异或(^):11得0,10得1 ...
- 程序员:java中直接或间接创建线程的方法总结
在java开发中,经常会涉及多线程的编码,那么通过直接或间接创建线程的方法有哪些?现整理如下: 1.继承Thread类,重写run()方法 class Worker extends Thread { ...
- Linux简介和环境的搭建
Linux的学习方向 网络服务器 嵌入式程序开发 Linux的设计哲学:一切皆文件 常用命令:cd 切换目录sudo shutdown -h now 关机命令sudo reboot 重启sudo ro ...
- mysql四种事务隔离级别
mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...
- 18 12 24 html 表单学习
html表单 表单用于搜集不同类型的用户输入,表单由不同类型的标签组成,相关标签及属性用法如下: 1.<form>标签 定义整体的表单区域 action属性 定义表单数据提交地址 meth ...
- MBR&/BOOT&GRUB
能正常工作的grub应该包 括一下文件:stage1.stage2.*stage1_5.menu.lst. 其中stage1要被安装(也就是写入)某个硬盘的主引导记录,或者某个活动分区(这个分区要 ...