Codeforces 26A - A. Almost Prime

26A - A. Almost Prime

素因数分解したときに、素因数の種類が 2 つかどうか求める問題。

import Data.List

factorize :: Int -> [Int]
factorize 1 = [1]
factorize n = fac 2 n
  where
    fac p n
      | n == 1         = []
      | n `mod` p == 0 = p : fac p (n `div` p)
      | otherwise      = fac (p+1) n

isAlmostPrime :: Int -> Bool
isAlmostPrime n = 2 == (length $ nub $ factorize n)

calc :: Int -> Int
calc n = sum [1 | i <- [1..n], isAlmostPrime i]

main = do s <- getLine
          print $ calc $ read s

リストの中にpredを満たすものがいくつあるか個数を返す関数が標準ライブラリにありそうだと思って調べたけれど見つかりませんでした。