POJ 2689 區間篩選質數

2021-07-26 05:31:02 字數 1461 閱讀 3798

題意:

給定區間 [l,u] 中,求相鄰兩個質數的 最大(小)差值 所對應的質數

有多組 [l,u]。

規模(1<=l< u<=2,147,483,647,區間長度<1,000,000. )

型別:

經典的區間篩選質數

分析:

定理:所有的合數都可以拆分為n個質數的乘積

從l,u的大小(2的32次)明白:最大的質因子 < 2的16次。所以先打個質數表prime1。

根據質數表prime1,可以和方便地求出 [l,u]內的合數,進而打出第二張質數表prime2([l,u]內的質數)。

最後暴力掃一遍。

prime[0]儲存質數的個數。

小心 l==1 時需要進行處理。

時間複雜度&&優化:

9064k 94ms

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = (1

<<16)+10;

const

int inf = 1000000007;

const

int mod = 1000000007;

int prime1[1

<<17];///2^16內的質數表,prime1[0]是質數的個數

void getprime1()

}}int notprime2[1000000+10];///質數性表,notprime2[0]表示l+0的質數性,1表示非質數,0表示質數

int prime2[1000000+10];

void getprime2(int l,int r)

}memset(prime2,0,sizeof(prime2));///得到:質數表

for(int i=l-l;i<=r-l;i++)

}}int main()

int maxx,minn,maxr,minr;

maxx=0;minn=inf;

for(int i=2;i<=prime2[0];i++)

if(prime2[i]-prime2[i-1]1];minr=prime2[i];}

}printf("%d,%d are closest, %d,%d are most distant.\n",minr-minn,minr,maxr-maxx,maxr);

}return

0;}

poj 2689 區間素數篩選

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

大區間素數篩選 POJ2689

題意 給乙個區間 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 內的素數儲...

POJ 2689 區間素數篩,區間移位

給出乙個區間 l,r 求其中相鄰的距離最近和最遠的素數對 其中 1 l r 2,147,483,647,r l 1e6 思路單純打表是不行的,l,r的範圍太大,不能直接求出所有素數。對於int範圍內的合數來說,最小質因子必定小於2 16。所以先用篩法選出50000內的素數即可,因為50000的平方大...