一本通1619【例 1】Prime Distance
1619: 【例 1】Prime Distance
题目描述
原题来自:Waterloo local,题面详见 POJ 2689
给定两个整数 L,R,求闭区间 [L,R] 中相邻两个质数差值最小的数对与差值最大的数对。当存在多个时,输出靠前的素数对。
输入格式
多组数据。每行两个数 L,R。
输出格式
详见输出样例。
样例
样例输入
2 17
14 17
样例输出
2,3 are closest, 7,11 are most distant.
There are no adjacent primes.
数据范围与提示
对于全部数据 1≤L<R<231,R−L≤106。
sol:不会算复杂度,总之怎么暴力都能过
先筛出1~500000的质数,在 l~r 中暴力去掉合数(真的非常非常非常非常非常非常暴力)
for(i=1;i<=*Prim&&Prim[i]<=r;i++) { int aa=(l-1)/Prim[i]+1; aa+=((aa==1)?(1):(0)); int bb=r/Prim[i]; for(j=aa;j<=bb;j++) { Bo[j*Prim[i]-l+1]|=1; } }
然后尴尬的过了
Ps:注意如果 l =1 的话要把 l 变成 2,因为 1 不是质数也筛不掉,不直接去掉会当成答案记录
#include <bits/stdc++.h> using namespace std; typedef int ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } inline void writeln(ll x) { write(x); putchar('\n'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) writeln(x) const int N=1000005; int Prim[N]; bool Bo[N]; bool Used[N]; inline void Pre_Prime() { int i,j; for(i=2;i<=500000;i++) { if(!Bo[i]) { Prim[++*Prim]=i; } for(j=1;j<=*Prim&&Prim[j]*i<=500000;j++) { Bo[Prim[j]*i]=1; if(i%Prim[j]==0) break; } } } int Num[N]; int main() { int i,j,l,r; Pre_Prime(); while(~scanf("%d%d",&l,&r)) { l+=(l==1)?(1):(0); *Num=0; memset(Bo,0,sizeof Bo); for(i=1;i<=*Prim&&Prim[i]<=r;i++) { int aa=(l-1)/Prim[i]+1; aa+=((aa==1)?(1):(0)); int bb=r/Prim[i]; for(j=aa;j<=bb;j++) { Bo[j*Prim[i]-l+1]|=1; } } for(i=1;i<=r-l+1;i++) if(!Bo[i]) { // printf("i=%d\n",i); Num[++*Num]=i+l-1; } if(*Num<2) { puts("There are no adjacent primes."); } else { int O1=1,O2=1; for(i=1;i<*Num;i++) { if(Num[i+1]-Num[i]<Num[O1+1]-Num[O1]) O1=i; if(Num[i+1]-Num[i]>Num[O2+1]-Num[O2]) O2=i; } printf("%d,%d are closest, %d,%d are most distant.",Num[O1],Num[O1+1],Num[O2],Num[O2+1]); putchar('\n'); } } return 0; } /* input 2 17 14 17 output 2,3 are closest, 7,11 are most distant. There are no adjacent primes. */
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!