pku2689 Prime Distance
来源:互联网 发布:vue.js 入门教程 编辑:程序博客网 时间:2024/05/17 01:56
#include<iostream>#include<vector>#include<algorithm>#include<cstdio>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<cmath>#include<cassert>#include<cstring>#include<iomanip>using namespace std;typedef long long i64;#define out64 "%lld\n"#define in64 "%lld"/************ for topcoder by zz1215 *******************/#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)#define FFF(i,a) for( int i = 0 ; i < (a) ; i ++)#define FFD(i,a,b) for( int i = (a) ; i >= (b) ; i --)#define S64(a) scanf(in64,&a)#define SS(a) scanf("%d",&a)#define LL(a) ((a)<<1)#define RR(a) (((a)<<1)+1)#define pb push_back#define CL(Q) while(!Q.empty())Q.pop()#define MM(name,what) memset(name,what,sizeof(name))#define read freopen("in.txt","r",stdin)#define write freopen("out.txt","w",stdout)const int inf = 0x3f3f3f3f;const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;const double oo = 10e9;const double eps = 10e-9;const double pi = acos(-1.0);// i64 gcd(i64 a,i64 b){return b?gcd(b,a%b):a;}i64 gcd(i64 _a, i64 _b){ if (!_a || !_b) { return max(_a, _b); } i64 _t; while ((_t = _a % _b)) { _a = _b; _b = _t; } return _b;}i64 ext_gcd (i64 _a, i64 _b, i64 &_x, i64 &_y){ if (!_b) { _x = 1; _y = 0; return _a; } i64 _d = ext_gcd (_b, _a % _b, _x, _y); i64 _t = _x; _x = _y; _y = _t - _a / _b * _y; return _d;}i64 invmod (i64 _a, i64 _p){ i64 _ans, _y; ext_gcd (_a, _p, _ans, _y); _ans < 0 ? _ans += _p : 0; return _ans;}vector<i64>p;bool is[1003011];bool vis[1001111];bool isp(i64 x){ i64 temp = sqrt(double(x)); for(i64 i=0;i<p.size();i++) { if(!(x%p[i])) { return false; } if(p[i]>temp) { return true; } } return true;}bool pp(i64 x){ if(x<100000) { return is[x]; } else { return isp(x); }}i64 l,r;int main(){ p.clear(); p.pb(2); MM(is,false); is[2] = true; for(i64 i=3;i<100000;i++) { if(isp(i)) { is[i]=true; p.pb(i); } } i64 k; i64 tmin; i64 tmax; i64 tx,ty; i64 pre; while(cin>>l>>r) { MM(vis,false); k=0; tmin = inf; tmax = 0; i64 temp; for(i64 u=0;u<p.size();u++) { i64 temp=i64(l/p[u])*p[u]; if(temp<l) { temp+=p[u]; } while(temp<=r) { if(temp>99999 || !is[temp]) { vis[temp-l]=true; } temp+=p[u]; } } if(l==1) { vis[0]=true; } for(i64 i=0;i<=r-l;i++) { if(!vis[i]) { if(k>=1) { if(i-pre<tmin) { tmin = i - pre; tx = pre+l; } if(i-pre>tmax) { tmax = i - pre; ty = pre+l; } } pre = i; k++; } } if(k>=2) { cout<<tx<<","<<tx+tmin<<" are closest, "<<ty<<","<<ty+tmax<<" are most distant."<<endl; } else { cout<<"There are no adjacent primes."<<endl; } } return 0;}