# Lời giải bài đếm số nguyên tố trong dãy ###### 📌 Tags: `Sieving` ,`Math` . ____ ## Ý tưởng :+1: * Đầu tiên ta cần nhận biết cách để kiểm tra một số có phải là số nguyên tố hay không ? * Với rất nhiều cách kiểm tra số nguyên tố thì ta phải chọn cách nào là phù hợp nhất ? ___ ## Các thuật toán kiểm tra số nguyên tố Ta có thể tham khảo ở [đây](https://vnoi.info/wiki/translate/he/Number-Theory-2.md) ____ ## Nhận xét :bulb: * Bài này có $n$ $\le$ $10^{5}$ nên không thể dùng hai thuật toán đầu như link trên * Và dữ kiện quan trọng là $a[i]$ $\le$ $10^{6}$ vừa hay lại phù hợp cách dùng của thuật toán sàng nên suy ra bài này .Đầu tiên ta phải sàng nguyên tố rồi sau đó chạy for từ $1->n$ để kiểm tra $a[i]$ có phải là số nguyên tố hay không , nếu có thì cập nhật biến kết quả lên $1$ ____ ## Code > **Time:** $O(10^{6} \log 10^{6})$ > **Space:** $O(n )$ > **Algo:** Sieveing . > [color=lightgreen] :::success :::spoiler code ``` cpp #include <bits/stdc++.h> using namespace std; #define ll long long const ll INF = 1e18 + 7; const ll MAXN = 1e6 + 7; bool nt[MAXN]; int n , a[MAXN] , d = 0; void sangnt(){ nt[0] = true; nt[1] = true; for(int i = 2 ; i * i <= MAXN - 7 ; i ++){ if(!nt[i]){ for(int j = i * i ; j <= MAXN - 7 ; j += i ){ nt[j] = true; } } } } int main(){ freopen("CNUMPRIM.inp" , "r" , stdin); freopen("CNUMPRIM.out" , "w" , stdout); cin >> n ; for(int i = 1 ; i <= n ; i ++){ cin >> a[i]; } sangnt(); for(int i = 1 ; i <= n ; i ++){ if(!nt[a[i]]){ d ++; } } cout << d; return 0; } ``` :::success :::::