Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- void simpleSieve(ll int limit, vector<ll int> &prime,ll int m)
- {
- bool mark[limit+1];
- memset(mark, true, sizeof(mark));
- for (ll int p=2; p*p<limit; p++)
- {
- if (mark[p] == true)
- {
- for (ll int i=p*2; i<limit; i+=p)
- mark[i] = false;
- }
- }
- for (ll int p=2; p<limit; p++)
- {
- if (mark[p] == true)
- {
- prime.push_back(p);
- //cout << p << " ";
- }
- }
- for(ll int i=0;i<prime.size();i++)
- {
- cout<<prime[i]<<" ";
- }
- }
- void segmentedsieve(ll int m,ll int n)
- {
- ll int limit = floor(sqrt(n))+1;
- vector<ll int> prime;
- simpleSieve(limit, prime, m);
- ll int low = limit;
- ll int high = n+1;
- while (low < (n))
- {
- if (high >= (n))
- high = (n);
- bool mark[limit+1];
- memset(mark, true, sizeof(mark));
- for (ll int i = 0; i < prime.size(); i++)
- {
- ll int loLim = floor(low/prime[i]) * prime[i];
- cout<<loLim;
- if (loLim < low)
- loLim += prime[i];
- /* if(i==(prime.size()-1))
- {cout<<loLim<<" h"<<high;}
- */
- for (ll int j=loLim; j<high; j+=prime[i])
- mark[j-low] = false;
- }
- for (ll int i = low; i<high; i++)
- if (mark[i - low] == true)
- cout << i << " ";
- low = low + limit;
- high = high + limit;
- }
- }
- int main() {
- //ll int m=10000100000;
- ll int t,m,n;
- cin>>t;
- while(t--)
- {
- cin>>m>>n;
- segmentedsieve(m,n);
- }
- //cout<<m;
- }
Add Comment
Please, Sign In to add comment