Problem:
Prime Numbers

A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. For example, the first four prime numbers are: 2, 3, 5 and 7.

Write a program which reads a list of N integers and prints the number of prime numbers in the list.

Input

The first line contains an integer N, the number of elements in the list.

N numbers are given in the following lines.

Output

Print the number of prime numbers in the given list.

Constraints

1 ≤ N ≤ 10000

2 ≤ an element of the list ≤ 108

Sample Input 1

5
2
3
4
5
6

Sample Output 1

3

Sample Input 2

11
7
8
9
10
11
12
13
14
15
16
17

Sample Output 2

4

Solution in Rust (judge verdict: Accepted)

use std::str::FromStr;
use std::collections::{HashMap,HashSet,VecDeque,BinaryHeap};
use std::cmp::{max,min,Ordering};
use std::io::Read;

fn main() {

    let mut buf = String::new();
    std::io::stdin().read_to_string(&mut buf).unwrap();
    let mut buf_it = buf.split_whitespace();

    let N = buf_it.next().unwrap().parse::<usize>().unwrap();
    let A = (0..N).map(|_| buf_it.next().unwrap().parse::<usize>().unwrap()).collect::<Vec<_>>();

    let m = 10000;
    let mut ans = 0;
    let primes = get_primes(m);
    for &a in &A{
        if a <= m{
            if primes.contains(&a) { ans += 1;}
        } else {
            let mut check = true;
            for &p in &primes{
                if a%p==0{
                    check = false;
                    break;
                }
            }
            if check {ans += 1;}
        }
    }
    println!("{}",ans);

}

fn get_primes(n:usize)->HashSet<usize>{
    let mut ret = HashSet::new();
    let mut checked = vec![false;n+1];
    for i in 2..n+1{
        if checked[i] {continue;}
        ret.insert(i);
        for j in 1..(n/i)+1{
            checked[i*j] = true;
        }
    }
    ret
}