304
Cerința
Se dau n numere naturale prime. Pentru t perechi de numere naturale s şi d să se afle câte numere naturale din intervalul [s,d] sunt divizibile prin cel puţin unul dintre cele n numere prime.
Date de intrare
Fișierul de intrare eratostene8.in conține pe prima linie numerele n şi t, pe a doua linie cele n numere prime, iar pe următoarele t linii câte o pereche de numere s şi d.
Date de ieșire
Fișierul de ieșire eratostene8.out va conține pe linia i răspunsul la întrebarea i, pentru orice i de la 1 la t.
Restricții și precizări
1 ≤ n ≤ 10.0001 ≤ t ≤ 100.0001 ≤ s ≤ d ≤ 10.000.000- numerele prime sunt mai mici sau egale cu
1.000.000
Exemplu
eratostene8.in
2 3 2 3 1 5 4 6 5 20
eratostene8.out
3 2 10
Explicație
Numerele prime date sunt 2 şi 3. În intervalul [1,5] sunt 3 numere divizibile cu 2 sau 3, în intervalul [4,6] sunt 2 numere divizibile cu 2 sau 3, iar în intervalul [5,20] sunt 10 numere divizibile cu 2 sau 3.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("eratostene8.in");
ofstream cout("eratostene8.out");
int n,t,s,d,E[10000001], P[10001];
bool F[1000001];
int main(){
cin >> n >> t;
for(int i = 1; i <= n; ++i)
cin >> P[i];
for(int i = 1; i <= n; ++i){
E[P[i]]=1;
if(F[P[i]] == 0){
for(int j = 2; j * P[i] <= 10000000; ++j)
E[P[i] * j] = 1;
F[P[i]] = 1;
}
}
for(int i = 1; i <= 10000000; ++i)
E[i] = E[i-1] + E[i];
for(int i = 1; i <= t; ++i){
cin >> s >> d;
cout << E[d] - E[s-1] << '\n';
}
}
Comentarii