---
tags: codebook
---
{%hackmd theme-dark %}
# sieve of eratosthenes
```cpp=
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
```
```cpp=
struct prime{
unsigned long long range;
vector<unsigned long long> v;
decltype(v.cend()) end(){return v.cend();}
decltype(v.cbegin()) begin(){return v.cbegin();}
bool operator[](const unsigned long long& x){
while(x>=range)
init(range,range+(1<<16)),range+=(1<<16);
return binary_search(v.begin(),v.end(),x);
}
void init(const unsigned long long& ori,const unsigned long long& x){
vector<bool> b(x-ori,true);
for(auto i=v.begin(),r=upper_bound(v.begin(),v.end(),sqrt(x));i!=r;i++)
for(unsigned long long j=*i*(ori/(*i)+bool(ori%(*i)));j<x;j+=*i)
b[j-ori]=false;
for(unsigned long long i=ori,j;i<x;i++)
if(b[i-ori]) for(v.push_back(i),j=i+i;j<x;j+=i)
b[j-ori]=false;
}
prime(const unsigned long long& x=2):range(x+1),v(1,2){init(3,x+1);}
};
```
## original_version
```cpp=
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
bool arr[20'000'000];
void eratosthenes() {
memset(arr, 0, sizeof(arr));
arr[0] = arr[1] = true;
int sqrtn = sqrt(20000000);
for (int i = 2; i <= sqrtn; i++)
if (!arr[i])
for (int k = (20000000 - 1) / i, j = i * k; k >= i; k--, j -= i)
if (!arr[k])
arr[j] = true;
}
```