大區間素數篩選 POJ2689

2021-07-03 14:00:10 字數 2172 閱讀 6188

題意:

給乙個區間[l,u],(1<=l< u<=2,147,483,647),u-l<=1000000,求出[l,u]內距離最近和距離最遠的素數對。

由於l,u都小於2^32,所以區間內的合數的最小質因子必然小於2^16,所以先篩出2^16以內的素數,用篩出來的素數去篩[l,u]內的合數。然後把[l,u]內的素數儲存下來,再搜尋最近和最遠的素數對即可。注意兩整數相乘可能溢位32位,注意對1的判斷。

**:

#include #include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define pb push_back

#define mp make_pair

#define rep(i,x,n) for(int i=x;i<(n);++i)

#define for(i,l,h) for(int i=(l);i<=(h);++i)

#define ford(i,h,l) for(int i=(h);i>=(l);--i)

#define sz(x) ((int)(x).size())

#define all(x) (x).begin(), (x).end()

#define ri(x) scanf("%d", &(x))

#define rii(x, y) scanf("%d%d", &(x), &(y))

#define riii(x, y, z) scanf("%d%d%d", &(x), &(y), &(z))

#define dri(x) int (x); scanf("%d", &x)

#define drii(x, y) int x, y; scanf("%d%d", &x, &y)

#define driii(x, y, z) int x, y, z; scanf("%d%d%d", &x, &y, &z)

#define oi(x) printf("%d",x);

#define rs(x) scanf("%s", (x))

#define ms0(x) memset((x), 0, sizeof((x)))

#define ms1(x) memset((x), -1, sizeof((x)))

#define len(x) strlen(x)

#define f first

#define s second

#define swap(a, b) (a ^= b, b ^= a, a ^= b)

#define dpoint strcut node

#define cmpd int cmp(const int &a,const int &b)

/*#ifdef home

freopen("in.txt","r",stdin);

#endif*/

const int mod = 1e9+7;

typedef vectorvi;

typedef vectorvs;

typedef vectorvd;

typedef long long ll;

typedef pairpii;

//#define home

int scan()

/*----------------please-----do-----not-----hack-----me--------------------*/

#define maxn 100000

int prime[maxn];

int vis[maxn+5];

int cnt;

void getprime()

}cnt2=0;

rep(i,0,u-l+1)

}int main()

rep(i,0,cnt2-1)

}printf("%d,%d are closest, %d,%d are most distant.\n",n1,n2,f1,f2);

} return 0;

}

poj 2689素數篩選

這道題目我就不貼題目了,就是素數篩選題。這道題目差點讓我崩潰,自己太菜的原因,提交了很多次,總是runtime error 後來才知道,素數篩選的範圍這能是2 16,然而這道題給的範圍超出了int的上界,所以,必須要用另外一種方法來篩選,看了人家的部落格,感覺方法超好。這道題有個突破點,就是區間在1...

poj 2689 區間素數篩選

由於給出的l和u太大,直接打表是不可能了。但u l 1e6,u 1e9,可以先篩出 0,sqrt u 內的素數,再以此去篩 l,u 內的素數,接著求出相鄰距離最短和最遠的一對素數就行了,這步就簡單了。如下 include include include include include include...

poj 2689 (素數二次篩選)

sample input 2 17 14 17sample output 2,3 are closest,7,11 are most distant.there are no adjacent primes.找出給定範圍內,距離最遠和最近的素數。不停超時 給的上界很大,所以全處理肯定不行。先處理sq...