The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145:

1! + 4! + 5! = 1 + 24 + 120 = 145

Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it turns out that there are only three such loops that exist:

169 → 363601 → 1454 → 169 871 → 45361 → 871 872 → 45362 → 872

It is not difficult to prove that EVERY starting number will eventually get stuck in a loop. For example,

69 → 363600 → 1454 → 169 → 363601 (→ 1454) 78 → 45360 → 871 → 45361 (→ 871) 540 → 145 (→ 145)

Starting with 69 produces a chain of five non-repeating terms, but the longest non-repeating chain with a starting number below one million is sixty terms.

How many chains, with a starting number below one million, contain exactly sixty non-repeating terms?


In [1]:
$fac = (0..9).to_a.map {|i| i.downto(1).inject &:* }
$fac[0] = 1
$fac


Out[1]:
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

In [2]:
def factorial_decompose(num)
  num.to_s.split("").map{|i| $fac[i.to_i]}.inject &:+
end

In [20]:
def find_factorial_chain(num)
  result = []
  result << num
  decompose = factorial_decompose(num)

  while decompose != num
    result << decompose
    decompose = factorial_decompose(decompose)

    return result.count + 1 - 1 if result[1..-1].include? decompose
  end

  
  return result.count - 1
end

In [21]:
factorial_decompose(145)


Out[21]:
145

In [22]:
find_factorial_chain 871


Out[22]:
1

In [30]:
(1..1_000_000).count{|i| find_factorial_chain(i) == 60 }


Out[30]:
402