けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AOJ 1276 Prime Gap (ICPC アジア 2007 B) (150 点)

素数砂漠なん!!!

問題へのリンク

問題概要

整数  N が与えられる。 N を含む素数砂漠 (連続する合成数) の長さを求めよ。

すなわち、 N 以上の最小の素数と、 N 以下の最大の素数との差を求めよ。

制約

  •  1 \le N \le 1299709

解法

エラトステネスの篩で予め 2000000 くらいまでの整数について素数かどうかをテーブルで持っておく

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

const int MAX = 10001000;
bool IsPrime[MAX];
vector<int> Era(int n = MAX) {
    vector<int> res;
    IsPrime[0] = false; IsPrime[1] = false; 
    for (int i = 2; i < n; ++i) IsPrime[i] = true;
    for (int i = 2; i < n; ++i) {
        if (IsPrime[i]) {
            res.push_back(i);
            for (int j = i*2; j < n; j += i) IsPrime[j] = false;
        }
    }
    return res;
}

int main() {
  Era();
  long long N;
  while (cin >> N) {
    if (N == 0) break;
    int prev = N, next = N;
    while (!IsPrime[prev]) --prev;
    while (!IsPrime[next]) ++next;
    cout << next - prev << endl;
  }
}