インターバルふるい素数

トピックへのリンク:https://cn.vjudge.net/contest/319720#overview

 

タイトル効果:隣接する二つの素数C1及びC2を見つけるための2つの入力数値LとU(1 <= L <U <= 2 147 483 647)、(L <= C1 <C2 <= U)の最小距離であります隣接素数の複数の対は、原稿を選択するだけでなく、隣接する二つの素数D1を識別する場合、及びD2は、(どのように状況で元々同じ選択)の最大距離であります

前記差L 1 000 000以下での<U、LとU

サンプル入力:

2 17
14 17

出力例:

2,3 7,11が最も離れている、最も近いです。
隣接する素数はありません。

 

 

アイデア:

所定の範囲の間隔で素数のすべてを取得する必要があり、次いで、素数間の最大距離は、最小距離を見つけます。まず、範囲内のスクリーンふるい区間[L、U]素数を使用しなければなりません。

データセクションが上限ヒット21億を超えているため、すべてではないが21未満万人が生き残る素数が、私たちは、インターバルの長さが1以上000 000、ふるいスクリーンアウト[L、U]すべての非プライム部分を使用することではないことがわかりました我々は、すべての非プライム因子を[L、U]間隔(選別最も小さい素数である非素数など)素数を知る必要があります。素数または数が素数2147483647、非素数のすべての素因数がルート2147483647内にある、すなわち、[L、U]間隔で分割することができる2147483647内の数です。

番号2147483647を見つけるために、すべての素数を進めることができ、その後、首相に使用されているすべての非指定セクションの素数を選別

 

1の#include <iostreamの>
 2の#include <ベクトル>
 3の#include <cstdioを>
 4の#include <CStringの>
 5の#include <cmath>
 6  使って 名前空間STD。
7 typedefの長い 長い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 ; = iが<Nを; iは++ ){
 15          であれば(!プライム[i])と
 16              プライム[++ TOT = I。
17          のためのint型 J = 0 ; J <TOT &&プライム[J] * iが<= N; J ++ ){
 18              プライム[i *が素数[J] = 1 19              もし(I%、プライム[J] == 0ブレーク20          }
 21      }
 22  }
 23  INTメイン(){
 24      // freopenは( "../ in.txt"、 "R&LT"、STDIN); 
25      getprime(50002 ;)
 26であり、     一方、(CIN >> L >> U){
 27          のmemset(isPrime、trueにsizeof (isPrime));
 28          のためにINT I = 0 ;私はTOTを<; I ++は){
 29              のint A =(L- 1)/プライム[I] + 1、B = U /プライム[I]; // Lそしてrが素数の倍数の最大値と最小数倍の範囲内の電流を表します。なぜそれ自体は、例えばすることを理解することができる、書き込み
30              のためのINT ; J <= B; J ++ J = A)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型私は= 0 ;私は= ULを<。 ++ I ){
 35              IF (isPrime [I]){
 36                  IF(POS == - 1 ){
 37 [                      POS = I。
38                      続け;
39                  }
 40                  であれば(I-POS < mindis){
 41                      、L1 = L + 陽。
42                      、R1 = L + I。
43                      mindis = I- POS。
44                  }
 45                  であれば(I-POS> {maxdis)
 46                      maxdis = I- POS。
47                      L2 = L + 陽。
48                      R2 = L + 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