Я знаю, что об этом уже спрашивали, но я не могу полностью понять, как реализовать сегментированное решето Эратосфена.
Проблема
Ввод начинается с количества t тестов в единственной строке (t ‹= 10). В каждой из следующих t строк есть два числа m и n (1 ‹= m‹ = n ‹= 1000000000, n-m‹ = 100000), разделенных пробелом. Для каждого тестового примера выведите все простые числа p такие, что m ‹= p‹ = n, по одному числу в строке, тестовые примеры разделены пустой строкой.
Мой подход
Я мог бы реализовать Решето Эратосфена и найти простые числа до квадратного корня из n. Но я не могу понять, как реализовать «смещение», которое обсуждается на других сайтах. Как выполнить сито на выбранном разделе?
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long m,n;
long long p[100001];
bool primes[100000];
cin>>m;
cin>>n;
long long square=sqrt(n);
cout<<square;
int j=0;
int i;
primes[0]=false;
primes[1]=false;
for(i=2; i<n;i++)
primes[i]=true;
for(i=2; i<=square; i++)
{
if(primes[i]==true)
{
for(j=i+i; j<=n; j+=i)
primes[j]=false;
}
}
for(i=m; i<n ; i++)
{
if(primes[i]==true)
{
cout<<i<<" \t";
if(i >= m)
{
p[j]=i;
j++;
}
}
}
for(i=0 ; i<j ; i++)
{
cout<<p[i]<<"\n";
}
}
return 0;
}