"血をもって書け。そうすればあなたは、血が精神だということを経験するだろう。"

Problem21

d(n)をnの真の約数の和と定義する。(真の約数とはn以外の約数のことである。)
もし、d(a) = b かつ d(b) = a を満たすとき、aとbは友愛数(親和数)であるという。

例えば、220の約数は1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110なのでd(220) = 284とである。
また、284の約数は1, 2, 4, 71, 142なのでd(284) = 220である。

それでは10000未満の友愛数の合計を求めよ。

haskell

main=print $ sum $ [n|n<-[1..9999],(y . y) n==n ,y n/=n]
y n=(+1) $ sum $ [if x*x==n then x else (+x) $ div n x | x<-[2..n-1],x*x<=n,mod n x==0]

answer

31626