/// Using Segmented Sieve to find Primes within a range (l..r)
/// Constaints: 1<=l<=r<=10^12, r-l<=10^6
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;
#define ll long long
#define llu unsigned long long
#define endl "
"
#define pb push_back
#define N 1000000
typedef vector <ll> vi;
bitset < N + 1 > numbers;
vi primes;
void sieve(){
numbers.set();
numbers[1] = 0;
for (ll i = 2; i<N; i++){
if (numbers[i] == 1){
primes.pb(i);
for (ll j = i*i; j<N; j+=i){
numbers[j] = 0;
}
}
}
}
int main(){
sieve();
ll t;
cin>>t;
while (t--){
ll l,r;
cin>>l>>r;
float tmpSqrt = sqrt(r);
ll sqrtR = (ll)tmpSqrt;
if (tmpSqrt != (float)sqrtR)
sqrtR++;
ll lastPrimeIndexInRange = 0;
while (primes[lastPrimeIndexInRange] <= sqrtR)
lastPrimeIndexInRange++;
numbers.set();
if (l == 1)
numbers[0] = 0;
for (llu i = 0; i<lastPrimeIndexInRange; i++){
ll firstMulti = (l/primes[i]) * primes[i];
if (firstMulti < l)
firstMulti += primes[i];
for (ll j = max(firstMulti, primes[i] * primes[i]); j<=r; j+= primes[i])
numbers[j-l] = 0;
}
for (ll i = 0; i<r-l+1; i++)
if (numbers[i] == 1)
cout<<i + l<<endl;
cout<<endl;
}
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <bitset>
#define N 1000000 //N is the Range (0..N)
bitset < N+1 > numbers;
vector < int > primes;
void sieve(){
numbers.set();
numbers[1] = 0;
for (int i = 2; i < N; i++){
if (numbers[i] == 1){
cout<<i<<endl;
primes.push_back(i);
for (int j = i*i; j<=N; j+=i)
numbers[j] = 0;
}
}
}
Code Example |
---|
Cpp :: c++ find_if |
Cpp :: armstrong number in cpp |
Cpp :: not in c++ |
Cpp :: how to iterate throguh a string in c++ |
Cpp :: prime factorisation of a number in c++ |
Cpp :: memcpy library cpp |
Cpp :: minimum value in array using c++ |
Cpp :: aray of functions in c++ |
Cpp :: how to add an element to std::map |
Cpp :: get value of enum cpp |
Cpp :: C++ break and continue |
Cpp :: c++ vector size |
Cpp :: functors in c++ |
Cpp :: c++ call by reference |
Cpp :: c++ fstream |
Cpp :: create copy constructor c++ |
Cpp :: c++ add two matrix |
Cpp :: c++ encapsulation |
Cpp :: c++ double is nan |
Cpp :: how to empty an array c++ |
Cpp :: how to specify the number of decimal places in c++ |
Cpp :: priority queue smallest first |
Cpp :: C++ Limit of Integer |
Cpp :: c include |
Cpp :: convert integer to string in c++ |
Cpp :: c++ compile to exe |
Cpp :: all permutations with repetition C++ |
Cpp :: size() in c++ SET |
Cpp :: vectors c++ |
Cpp :: how to create a c++ templeate |