題意:
給定區間 [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的平方大...