project euler problem 28

73 74 75 76 77 78 79 80 81
72 43 44 45 46 47 48 49 50
71 42 21 22 23 24 25 26 51
70 41 20 7 8 9 10 27 52
69 40 19 6 1 2 11 28 53
68 39 18 5 4 3 12 29 54
67 38 17 16 15 14 13 30 55
66 37 36 35 34 33 32 31 56
65 64 63 62 61 60 59 58 57

増分を記述すると

1 3 5 7 9 13 17 21 25 31 37 43 49 57 65 73 81
+2 +2 +2 +2 +4 +4 +4 +4 +6 +6 +6 +6 +8 +8 +8 +8

ここで、各増分の末項は9,25,49,81と奇数の二乗になっているのを利用して

Prelude> let n=1001 in sum $ concat ([1]:[[b-3*c,b-2*c,b-c,b]|a<-[3,5..n],let b=a*a;c=a-1])
669171001
(0.01 secs, 3149680 bytes)