Problem 1276 : Prime Gap

Problem B: Prime Gap
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1276

  • 問題概要

与えられた数が素数が現れない範囲だったら、その領域の長さを答えろ。
素数なら0って言えー!

  • 解法

エラトステネスしながら、前に素数が現れた場所を記憶して次に現れたときにその幅を
そこまでのテーブルに記憶する。
先にテーブル作っちゃう。

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cassert>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
#define mp         make_pair
#define vint       vector<int>
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)
#define lli	    long long int
#define ld	    long double

#define N 1299710+3

using namespace std;


main(){
  bool t[N];
  int g[N], pre=0;
  
  fill(t, t+N, true);
  fill(g, g+N, 0);
  t[0] = t[1] = false;
  rep(i, N/2){
    if(!t[i])continue;
    REP(j, pre+1, i){
      g[j] = i - pre;
    }
    pre = i;
    for(int j=2; j*i < N; j++){
      t[i*j] = false;
    }
  }
  int n;
  while(cin >> n){
    if(n==0)break;
    cout << g[n] << endl;
  }
}

なぜかNに+3しないと通らない。
@primia に言われてなおした
よくわからん。