fork download
  1. primes = (2 : filter (check primes) [3..]) where
  2. check (p:ps) n | p*p > n = True
  3. | n `mod` p == 0 = False
  4. | otherwise = check ps n
  5.  
  6. primeDivs n = divs n primes where
  7. divs 1 _ = []
  8. divs n (p:ps) =
  9. if p*p > n
  10. then [(n, 1)]
  11. else let (c, r) = cnt n p 0 in
  12. if c == 0
  13. then divs n ps
  14. else (p, c) : divs r ps
  15. cnt n p c | mod n p == 0 = cnt (div n p) p (c+1)
  16. | otherwise = (c, n)
  17.  
  18. combine divs = comb [1] divs where
  19. comb list [] = list
  20. comb list ((p, c) : ps) =
  21. comb [ x*y | x <- take (c+1) $ iterate (*p) 1, y <- list ] ps
  22.  
  23. sumDiv n = (sum $ combine $ primeDivs n) - n
  24.  
  25.  
  26. friends :: [(Int, Int)]
  27. friends = filter (\(x, s) -> x < s && sumDiv s == x) $ map (\x -> (x, sumDiv x)) [1..]
  28.  
  29. main = mapM print $ take 30 friends
  30.  
Success #stdin #stdout 2.41s 3544KB
stdin
Standard input is empty
stdout
(220,284)
(1184,1210)
(2620,2924)
(5020,5564)
(6232,6368)
(10744,10856)
(12285,14595)
(17296,18416)
(63020,76084)
(66928,66992)
(67095,71145)
(69615,87633)
(79750,88730)
(100485,124155)
(122265,139815)
(122368,123152)
(141664,153176)
(142310,168730)
(171856,176336)
(176272,180848)
(185368,203432)
(196724,202444)
(280540,365084)
(308620,389924)
(319550,430402)
(356408,399592)
(437456,455344)
(469028,486178)
(503056,514736)
(522405,525915)