간격 체 소수

주제 링크 : 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 }

 

추천

출처www.cnblogs.com/-Ackerman/p/11348370.html