project euler problem 23
面倒だったので 力技で行ったら40分かかった。
どうやって高速化しようか…
import Data.List main = print $ (sum [1..m]) - ( sum $ map head $ group $ sort [x+y|x<-abundantNumbers,y<-abundantNumbers\ ,x+y<=m]) abundantNumbers::[Int] abundantNumbers = [x|x<-[2..m],isAbundant x] isAbundant::Int->Bool isAbundant n = n < sum [x|x<-[1..n-1],mod n x==0] m = 28122
arrayで過剰数のものだけマーキングした。
import Data.Array main = print $ (sum [1..m]) - (sum c) a = listArray (1,m) [n < sum [x|x<-[1..n-1],mod n x==0]|n<-[1..m]] b = map fst $ filter snd $ assocs a c = filter d [1..m] d x = any (\y->(x>y)&&(a!(x-y))) b m = 28122
assocsの分だけ遅くなっているんじゃないだろうか 現在10秒台
dの判定ロジックを逆にしたいんだがうまく行かない sum [1..m] で遅くなっているとおもって (m*(m+1) `div` 2) に変えてみたが全然関係なかった。