fbpx

Problema #2325 – prim003 – Rezolvari PBInfo

de Mihai-Alexandru

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.000
  • 1 ≤ 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;
}
Comentarii

S-ar putea sa iti placa