---
# System prepended metadata

title: Lời giải bài  đếm số nguyên tố trong dãy

---

# 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
:::::