Cerința
Anul 2017 tocmai s-a încheiat, suntem trişti deoarece era număr prim, însă avem şi o veste bună, anul 2018 este produs de două numere prime, 2 şi 1009. Dorel, un adevărat colecţionar de numere prime, şi-a pus întrebarea: “Câte numere dintr-un interval [a,b] se pot scrie ca produs de două numere prime? “.
Date de intrare
Programul citește de la tastatură numărul natural t, iar apoi t perechi de numere naturale a,b cu a≤b, separate prin spații.
Date de ieșire
Programul va afișa pe ecran, pentru fiecare pereche a,b, numărul numerelor din intervalul [a,b] care se pot scrie ca produs de două numere prime.
Restricții și precizări
1 ≤ t ≤ 100.0001 ≤ a ≤ b ≤ 1.000.000
Exemplu
Intrare
3 1 7 10 30 88 100
Ieșire
2 7 4
Explicație
În intervalul [1,7] sunt 2 numere ce se pot scrie ca produs de două numere prime: 4 şi 6. În intervalul [10,30] sunt 8 numere: 10,14,15,21,22,25,26. În intervalul [88,100] sunt 4 numere: 91,93,94,95.
#include <bits/stdc++.h>
using namespace std;
int n , a , b , p[1000000] , E[1000000] , s[1000000] , rez[1000000];
int main()
{
p[0] = p[1] = 1;
for(int i = 2 ; i <= 500000 ; ++i)
for(int j = 2 ; i*j <= 1000000 ; ++j)
p[i*j]=1;
for(int i = 2 ; i <= 500000 ; ++i)
for(int j = 2 ; i*j <= 1000000 ; ++j)
if(p[i]==0 && p[j]==0)
E[i*j]=1;
for(int i = 1 ; i <= 1000000 ; ++i)
{
s[i] = s[i-1];
if(E[i] == 1) s[i]++;
}
cin >> n;
for(int i = 1; i <= n ; ++i)
{
cin >> a >> b;
if(E[a] == 1) rez[i] = s[b]-s[a]+1;
else rez[i] = s[b]-s[a];
}
for(int i = 1 ; i <= n ;i++)
cout << rez[i] << " ";
return 0;
}