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

2021-09-23 20:52:03 字數 1176 閱讀 5947

給出乙個區間 [l, r] 求其中相鄰的距離最近和最遠的素數對 . 其中 1 <= l < r <= 2,147,483,647, r - l <= 1e6

思路單純打表是不行的,l,r的範圍太大,不能直接求出所有素數。對於int範圍內的合數來說,最小質因子必定小於2^16。所以先用篩法選出50000內的素數即可,因為50000的平方大於int範圍了。再用這些素數去篩出r-l之間的合數,剩下的就是r-l之間的素數了。然後依次比較求出相鄰素數的最大值和最小值即可。二次篩法。。。

區間長度只有1e6,所以在存的時候雖然不能直接存每個數,但是可以加個偏移量l,這樣便可存的下。

#include

#include

#include

#define ll long long

using

namespace std;

const

int maxn =

1e6+10;

const

int max =

1e5;

int prime[max]

,vis[maxn]

, cnt;

void

get_prime

(void)}

}int

main

(void)}

if(l ==

1) vis[0]

=1;// 當l是1時,vis[0]=1表示1不是素數

ll pre =-1

, sol1 = maxn, sol2 =

0, x1, y1, x2, y2;

//pre代表上乙個素數

for(

int i =

0; i <= r - l; i++)if

(sol2 < i - pre)

} pre = i;}}

if(sol2 ==0)

puts

("there are no adjacent primes.");

else

printf

("%lld,%lld are closest, %lld,%lld are most distant.\n"

, x1 + l, y1 + l, x2 + l, y2 + l);}

return0;

}

poj 2689 區間素數篩選

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

POJ 2689 區間篩選質數

題意 給定區間 l,u 中,求相鄰兩個質數的 最大 小 差值 所對應的質數 有多組 l,u 規模 1 l u 2,147,483,647,區間長度 1,000,000.型別 經典的區間篩選質數 分析 定理 所有的合數都可以拆分為n個質數的乘積 從l,u的大小 2的32次 明白 最大的質因子 2的16...

大區間素數篩選 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 內的素數儲...