poj2689 两次素数筛法
2016-07-17 12:53
316 查看
#include<iostream> #include<cstring> using namespace std; const int MAX=50000; bool vis[MAX],isp[1000005]; int prime[MAX],res[100000]; int num=0; long long l,u; void getprime() { memset(vis,true,sizeof(vis)); vis[1]=false; long long i,j; for(i=2;i<=MAX;i++) if(vis[i]) { num++; prime[num]=i; for(j=i*i;j<=MAX;j+=i) vis[j]=false; } } void work() { long long i,j,cnt=0,tmp,c1,c2,d1,d2; memset(isp,true,sizeof(isp)); for(i=1;i<=num&&prime[i]*prime[i]<=u;i++) { tmp=l/prime[i];//快速找到l~u区间内素数的位置 if(tmp*prime[i]<l) tmp++; if(tmp==1) tmp++; for(j=tmp*prime[i];j<=u;j+=prime[i]) isp[j-l]=false; } if(l==1) isp[0]=false; for(i=0;i<=u-l;i++) { if(isp[i])//表示到l距离为i的点是否是素数 { res[cnt++]=i+l;//还原该素数 } } if(cnt<=1) cout<<"There are no adjacent primes."<<endl; else { long long maxn=0,minn=0xfffffff; for(i=1;i<cnt;i++) { if(res[i]-res[i-1]<minn) { minn=res[i]-res[i-1]; c1=res[i-1]; c2=res[i]; } if(res[i]-res[i-1]>maxn) { maxn=res[i]-res[i-1]; d1=res[i-1]; d2=res[i]; } } cout<<c1<<','<<c2<<" are closest, "<<d1<<','<<d2<<" are most distant."<<endl; } } int main() { while(cin>>l>>u) { getprime(); work(); } return 0; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Project Euler Problem 387 - Harshad Numbers - 深度优先
- 编程之美2015初赛A
- 数论题集
- 原根
- 阶与原根学习笔记
- HDU 1299 Diophantus of Alexandria
- Leftmost Digit(HDU 1060)
- Rightmost Digit(HDU 1061)
- Python-在奇数中寻找素数
- ZOJ 2674 Strange Limit 欧拉定理
- LeetCode-Palindrome Number
- 组合数求模总结
- Sicily 1047 Super Snooker
- 【数论】组合数求模