給定兩個整數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...