2日旅行、道ACが戻ってこの質問に来ました。
%のB問題をP1865
タイトルは、範囲を告げる:レンジ両極端は、1E6の最大値の範囲の両端-1e9と1E9(これはあなたをからかってテストデータで、負の実際のトピックはあり得ない)です。
Lまたはラインを横断表題r∉[1、m]が出力言っは、次にLのプライム要件〜Rのタイトル番号に変換し、Lは、最小1、Rの最大1E6です。
これは、式オングストローム、合計累積クリックのふるいでふるい分け0〜1E6の間の素数をすべて保存することができ、オープン1E6の配列とみなすことができます。和[R] -sum [L]は答えです。
重要な注意 - 開閉間隔を注意してください、このような[2,9]などの間隔を、単純合算[R] -sum [L] 3を得るが、実際には、2の答えも素数ですが、差し引かれた、それは左端のゾーンを宣告必要が特別ですそして、答えは1で、素数です。それがなければわずか36分かかります。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 int型、N、M、L、R、和[ 1000005 ]、T。 BOOL [ 1000005 ] = { 1、1 }。 INT メイン() { scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 I = 2 ; I <= M; I ++ ) のための(INT J = I; J <= M; J = J + I) もし(I%以下のJ =!0 [J] =)1 。 以下のための(int型私は=1 ; I <= M。私は++ ) 場合!([i])との和[I] ++ ; 用(int型 iは= 1 ; I <= M Iは++ ) 和[I] + =和[I- 1 ]。 以下のために(int型私= 1 ; iが<= N; iが++ ) { scanf関数(" %dの%のD "、&L&R)。 場合(L> M || L < 1 || R> M || R < 1 ) { COUT << " ラインクロッシング" << ENDL。 続け; } もし(式中、R == 1 ) { COUT << 0 << ENDL。 続け; } T =和[R] - 和[L]。 もし(![L])トン++ ; printf(" %d個の\ n " 、T)。 } 戻り 0 。 }