問題の意味:隣接プライムにおける最小値と最大要件[L、R]の差(間隔長は1E6を超えません)。
、、非素数$ N- $は必ずしも超えない$ \の主SQRTことN $が選別されて以来、最初の画面のでアウト$ [1、\ SQRT R]すべての素数$、その後$ [Lをスクリーニングするために、これらの素数を用いてR] $。
注1は素数ではありませんが、選別されることはありません(巨大ピット~~)
1の#include <cstdioを> 2の#include <アルゴリズム> 3 使用して 名前空間STDを、 4のtypedef 長い 長LL。 5 CONST LL N = 1E5 + 10、INF = 0x3f3f3f3f 。 6 LLのL、R、ISP1 [N]、ISP2 [N * 10 ]、PRI [N * 10 ]、Npriと。 7 ボイドgetpri1(){ 8 のための(LL I = 2 ; iがNを<; ++ I)ISP1 [I] = 1 。 9 用(LL I = 2 ; iがNを<; ++ I)の場合(ISP1は[i])とするための(LL J =2 ; 私がj <Nを*; ++ j)がISP1 [iがjは*] = 0 ; 10 } 11 空隙getpri2(){ 12 用(LL i = 0 ; iが<= RL; ++ I)ISP2 [I] = 1 。 13 のために(LL I = 2 ; iは= Rを<*; ++ i)があれば(ISP1 [I]) 14 のための(LL J = MAX(2LL、(L- 1)/ I + 1)、iがjで* < = R; ++ j)はISP2 [私はJLを*] = 0 ; 15 } 16 INT メイン(){ 17 getpri1()。 18 一方(scanf関数(" %のLLDの%のLLD "、&L&R)==2 ){ 19 getpri2()。 20 = Npriと0 。 21 のためには、(LL iはLを=; I <= R; ++ I)であれば(ISP2 [iLの】&& I =!1)PRI [Npriと++] = I。 22 であれば(Npriと< 2)プット(" なし隣接素数はありません。" )。 23 他{ 24 LL MI = 1、MX = 1 。 25 のために(LL I = 2、I <Npriと; ++ I){ 26 であれば(PRI [i]が-pri [I- 1 ] <PRI [MI] -pri [MI- 1])MI = I。 27 であれば(PRI [i]が-pri [I- 1 ]> PRI [MX] -pri [MX- 1 ])MX = I。 28 } 29 のprintf(" %のLLDは、%LLDは、%のLLD%のLLD最も近い最も離れている。\ n "、PRI [MI- 1 ]、PRI [MI]、PRI [MX- 1 ]、PRI [MX] ); 30 } 31 } 32 リターン 0 。 33 }