Problem:
Prime Factorization

Factorize a given integer n.

Input

n

An integer n is given in a line.

Output

Print the given integer n and :. Then, print prime factors in ascending order. If n is divisible by a prime factor several times, the prime factor should be printed according to the number of times. Print a space before each prime factor.

Constraints

2 ≤ n ≤ 109

Sample Input 1

12

Sample Output 1

12: 2 2 3

Sample Input 2

126

Sample Output 2

126: 2 3 3 7

Solution in Haskell (judge verdict: Accepted)

main = do
    n <- readLn
    putStr (show n ++ ": ")
    putStrLn $ unwords.map show.primeFactorize $ n
primeFactorize :: Integer -> [Integer]
primeFactorize n = pf n primes

pf :: Integer -> [Integer] -> [Integer]
pf n (x:xs)
  | x > n = []
  | isPrime n = [n]
  | modnx == 0 = x : pf divnx (x:xs)
  | otherwise = pf n xs
  where (divnx, modnx) = divMod n x

primes :: [Integer]
primes = 2 : filter isPrime [3,5..]

isPrime :: Integer -> Bool
isPrime n = all (/= 0).map (mod n).takeWhile (<= sqrtn) $ primes
    where sqrtn = floor.sqrt.fromIntegral $ n