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 に言われてなおした
よくわからん。