篩指定區間的素數 區間偏移二次篩法

2021-10-06 21:23:04 字數 1744 閱讀 6292

給定兩個整數l和u,你需要在閉區間[l,u]內找到距離最接近的兩個相鄰質數c1和c2(即c2-c1是最小的),如果存在相同距離的其他相鄰質數對,則輸出第一對。

同時,你還需要找到距離最遠的兩個相鄰質數d1和d2(即d1-d2是最大的),如果存在相同距離的其他相鄰質數對,則輸出第一對。

1 ≤l

231−1

,u−l

∈[0,

1e6]

1≤l1≤

l231−

1,u−

l∈[0

,1e6

] (1)231−

1≈1e

923

1−1≈

1e9無論是尤拉篩還是埃氏篩法都是從[1,

n]

[1,n]

[1,n

]開始篩的,這個資料範圍都是無法接受的

(2)很明顯如果這個乙個數的是合數:那麼這個數一定有乙個質因子d

<=n

d<=\sqrt n

d<=n

​(3)那麼我們就先把[1,

n]

[1,\sqrt n]

[1,n​]

內的素數篩出來1e9

≈5e4

1e9​≈5

e4可以接受

(4)那麼我們就把這些素數去篩[l,

u]

[l,u]

[l,u

]的素數

(5)根據埃氏篩法我們要找到[l,

u]

[l,u]

[l,u

]這個區間內第乙個大於質數p

pp,並且是p

pp的倍數之後就每次+p+p

+p一次篩下去;

(6)第乙個大於p

pp並且是p

pp的倍數⌈lp

⌉∗p≈

⌊l+p

−1p⌋

∗p

⌈pl​⌉∗

p≈⌊p

l+p−

1​⌋∗

p(7)因為數很大我們可以讓[

[[區間整體−l]

∈[0,

1e6]

-l]\in[0,1e6]

−l]∈[0

,1e6

] 題目鏈結(qwq)戳我

#include

using

namespace std;

const

int n =

6e6+10;

long

long prime[n]

, cnt;

bool vis[n]

;void

init

(int n)}}

intmain()

cnt =0;

for(

long

long i =

0; i <= r - l;

++ i)if(

!vis[i]

&& i + l >=2)

prime[cnt ++

]= i + l;

int maxp =

0, minp =0;

for(

int i =

0; i < cnt -1;

++ i)

if(cnt <2)

puts

("there are no adjacent primes.");

else

}return0;

}

區間素數篩

給定整數a和b,請問區間 a,b 內有多少個素數?ab a 10 6 因為b以內合數的最小質因數一定不超過sqrt b 如果有sqrt b 以內的素數表的話,就可以把篩選法用在 a,b 上了,先分別做好 2,sqrt b 的表和 a,b 的表,然後從 2,sqrt b 的表中篩得素數的同時,也將其倍...

區間素數篩

題目 p1835 素數密度 題目中區間的端點很大,但是區間的長度不長.解題思路 1.先用埃氏篩選掉 1 到 sqrt r 的合數 2.用第一步的素數表篩選掉 l 到 r 的合數 一二步一起進行 3.計算素數個數 includeusing namespace std const int ma 1e6 ...

素數篩 埃氏篩 線性篩 區間篩)

顧名思義,素數篩就是用來篩素數的。1.埃氏篩 o nloglogn 對於一般 不毒瘤 的素數題,埃氏篩就夠了 原理 任何合數都有小於自身的質因數 內容 對於每乙個素數將它的 2 i x i i全部標記為1,使得所有的合數全被標記 不足 合數會被標記素因數次,不夠高效 void prime int x...