Original Blog http://www.cnblogs.com/nowandforever/p/4515612.html
/************************************************* Author:P owatr* Created time:2015-8-17 8:56:45* File Name : Interval sieve method. cpp ************************************************/#include <cstdio> #include <algorithm># Include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string > #include <vector> #include <queue> #include <deque> #include <stack> #include <list># Include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime>using namespace std; #define Lson L, Mid, RT << 1#define Rson mid + 1, R, RT << 1 | 1typedef long ll;const int MAXN = 1e5 + 10;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;bool Is_prime_small[max N];bool is_prime[maxn];ll prime[maxn];ll cout1;void Segment_sieve (ll A, ll b) {for (ll i = 0; i*i < b; i++) Is_prim E_small[i] = true; for (ll i = 0; i < b-a; i++) is_prime[i] = true; for (ll i = 2; I*i < b; i++) {if (Is_prime_small[i]) {for (ll j = 2*i; J *j < b; j+=i) is_prime_small[j] = false; for (ll j = Max (1ll*2, (a+i-1)/i*i); J < b; j+=i) is_prime[j-a] = false; }} for (ll i = 0; i < b-a; i++) {if (Is_prime[i]) prime[++cout1] = I+a; }} int main () {ll A, B; while (~SCANF ("%i64d%i64d", &a, &b)) {cout1 = 0; memset (prime, 0, sizeof (prime)); Segment_sieve (A, b); printf ("%i64d\n", COUT1); } return 0;}
Template--Interval sieve method