type intseq = Cons of int * (int -> intseq) ;; (* 整数の無限列 *)

let rec is_divisible lst x = (* リストのいずれかの要素でxが割り切れるかどうかチェックする. *)
  let max = float_of_int x |> sqrt |> int_of_float in (* チェックする最大値 *)
  match lst with
    [] -> false 
  | p::ps when p > max -> false
  | p::ps -> if x mod p = 0 then true
             else is_divisible ps x ;;

let rec prime_seq primes x =    (* 素数の無限列. primesはアキュムレータであり, 素数のリスト *)
  if is_divisible primes (x+1) then prime_seq primes (x+1)
  else Cons(x+1, prime_seq (primes @ [x+1])) ;;

let is_prime x =                (* xが素数かどうかチェックする *)
  let max = float_of_int x |> sqrt |> int_of_float in
  let rec is_p p_seq =            (* xが素数の数列で割り切れるかチェックする *)
    let Cons(n, f) = p_seq in
    if n > max then true
    else if x mod n = 0 then false
    else is_p (f n)
  in
  is_p (prime_seq [] 1) ;;

let () =
  let open Scanf in
  let m = scanf "%d\n" (fun x -> x) in
  let as_ = Array.init m (fun _ -> scanf "%d\n" (fun x -> if is_prime x then 1 else 0)) in
  Array.fold_left (+) 0 as_
  |> Printf.printf "%d\n" ;;
