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. sumDiv n = (divs n primes) - n where
  7. divs 1 _ = 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 (sum $ take (c+1) $ iterate (*p) 1) * (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. friends :: [(Int, Int)]
  19. friends = filter (\(x, s) -> x < s && sumDiv s == x) $ map (\x -> (x, sumDiv x)) [1..]
  20.  
  21. main = mapM print $ take 37 friends
Success #stdin #stdout 1.76s 3588KB
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)
(600392,669688)
(609928,686072)
(624184,691256)
(635624,712216)
(643336,652664)
(667964,783556)
(726104,796696)