Merge branch 'master' of git://factorcode.org/git/factor
[factor/jcg.git] / extra / project-euler / 169 / 169.factor
blobef43fc3c340cdc97b5883ac19828f1d4fa61757d
1 ! Copyright (c) 2007 Samuel Tardieu.
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: project-euler.169
4 USING: combinators kernel math math.functions memoize ;
6 ! http://projecteuler.net/index.php?section=problems&id=169
8 ! DESCRIPTION
9 ! -----------
11 ! Define f(0) = 1 and f(n) to be the number of different ways n can be
12 ! expressed as a sum of integer powers of 2 using each power no more than
13 ! twice.
15 ! For example, f(10) = 5 since there are five different ways to express 10:
17 ! 1 + 1 + 8
18 ! 1 + 1 + 4 + 4
19 ! 1 + 1 + 2 + 2 + 4
20 ! 2 + 4 + 4
21 ! 2 + 8
23 ! What is f(10^25)?
26 ! SOLUTION
27 ! --------
29 MEMO: fn ( n -- x )
30     {
31         { [ dup 2 < ]  [ drop 1 ] }
32         { [ dup odd? ] [ 2/ fn ] }
33         [ 2/ [ fn ] [ 1- fn ] bi + ]
34     } cond ;
36 : euler169 ( -- result )
37     10 25 ^ fn ;
39 ! [ euler169 ] 100 ave-time
40 ! 0 ms ave run time - 0.2 SD (100 trials)
42 MAIN: euler169