주제 링크 : https://cn.vjudge.net/contest/319720#overview
타이틀 효과 두 입력 번호 L과 U (1 <= L <U <= 12 147 483 647), 두 개의 이웃하는 소수의 C1 및 C2 (L를 <= C1 <C2 <= U) 찾을 수있는 최소 거리 인접한 소수 개 이상의 쌍, 원본을 선택할뿐만 아니라, 두 개의 인접한 소수 D1을 식별하는 경우, 그리고 D2는 (어떻게 상황에서 원래 같은 선택) 최대 거리
상기 차분 L <U, U 및 L하게는 1,000,000보다
샘플 입력 :
(2) 17
14 17
샘플 출력 :
2,3 7,11 가장 먼, 가장 가까운.
더 인접한 소수가 없습니다.
아이디어 :
주어진 범위 간격의 소수의 모두를 얻기 위해 필요하고 소수 사이의 최대 거리가 최소 거리를 찾을 수 있습니다. 먼저, 범위 내의 스크린 체 간격 [L, U] 소수를 사용할 수있다.
데이터 섹션은 상한 히트 2,100,000,000을 초과하기 때문에, 모든 미만 2,100 만 살아남을 소수가 있지만, 우리는 간격의 길이가 1 개 이상 000 000, 체 화면 밖으로 [L, U] 이외의 모든 주요 섹션의 사용 아니라고 발견 우리는 알 필요가 [L를, U] 구간 이외의 모든 소인수 (교체 아웃 상영 가장 작은 주요 요인이 아닌 소수와 같은) 소수. 숫자가 소수 2147483647 의해 소수 또는 2,147,483,647 내의 다수의 분할 될 수있다, 즉, [L, U] 구간 이외의 모든 소수 소인수 루트 2147483647 내에있다.
번호 2147483647을 찾기 위해 소수를 발전 할 수 다음 프라임에 사용되는 모든 비 지정 섹션 소수를 상영
1 #INCLUDE <iostream> 2 #INCLUDE <벡터> 3 #INCLUDE <cstdio> 4 #INCLUDE <CString을> 5 #INCLUDE <cmath> 6 이용한 스페이스 성병; 7 형식 정의 긴 긴 LL; 8 CONST INT maxn = 50005 ; 9 INT 프라임 [maxn]; 10 INT의 L, U, TOT = 0 ; 11 부울 isprime [ 1000005 ]; (12) 보이드 getprime ( INT의 N) { 13 memset 함수 (프라임, 0 , sizeof 연산자 (프라임)); (14) 에 대한이 ( int로 I = 2 ] = 1은 N <단계; 내가 ++ ) { 15 일 경우 (! 프라임 [I]) 16 프라임 [++ TOT = I; 17 대 ( INT의 J = 0 ; J <TOT && 프라임 [J] * 내가 <= N; J ++ ) { 18 프라임 [내가 * 프라임 [J]] = 1 ; 19 일 경우 (I %의 프라임 [J] == 0 ) 분해 ; 20 } 21 } 22 } 23 INT주 () { 24 // freopen을가 ( "../ in.txt", "R & LT"표준 입력) 25 getprime ( 50002 ) (26)이 그동안 (CIN >> L >> U) { 27 memset 함수 (isPrime, 참으로 , sizeof의 (isPrime)), 28 대 ( INT I = 0 ; I는 TOT를 <; I는 ++ ) { 29 INT를 A = (L- 1이다. ) / 프라임 [I] + 1. , B = U / 프라임 [I]; // L R은 소수의 배수의 최대 및 최소 수의 여러 범위의 전류를 나타낸다. 왜 자체가 이해 될 수 있으며, 물품이 예를 들면 30 대 ( INT J = A, J <= B, J ++) IF (J> . (1)) IsPrime [프라임 * J [I] -1] = 0 ; // 경우 J = 1, 이번에는 [I], 프라임 [I 프라임 인 경우 ] 프라임 번호 31이다 } 32 IF (L == 1. ) isPrime [ 0 = 0 ; // 주의 공보 중재 경우 L = 1, 33는 INT의 POS = - 1 , L1은 R1, L2, R2는 maxdis = 0 , = mindis 0x3f3f3f3f ; 34 인 위해 ( INT I = 0 ; I는 = UL을 <; I ++ ) { 35 IF (isPrime [I]) { 36 IF (POS == - 1. ) { 37 POS = I; (38) 계속 ; 39 } 40 의 경우 (I-POS < mindis) { 41 (L1) = L + POS; 42 R1 = 리터 + I; 43 mindis = I- POS; 44 } 45 의 경우 (I-POS> maxdis) { 46 maxdis = I- POS; (47) L2 = L + POS; (48) R2 = 리터 + I; 49 } 50 POS = I; (51) } 52 } 53 의 경우 (maxdis == 0 )의 printf ( " 더 인접 소수 없다 \ n. " ); 54 다른에서 의 printf ( " % d를, % d를, %의 D, D %의 가장 먼 가장 가까운된다 \ n. " , L1, R1, L2, R2); 55 } 56 반환 0 ; 57 }