fork download
  1. def gm1(m)
  2. q, r = m.divmod 5
  3. (0 < r ? [r] : []) + [5] * q
  4. end
  5. def next_or_nil(a)
  6. a = a.dup
  7. k = a.rindex {|ak| 1 < ak}
  8. i = k && (k-1).downto(0).find {|i| a[i] != 5}
  9. if !k
  10. nil
  11. elsif !i
  12. a[k] -= 1
  13. ([1] + a.reverse)
  14. else
  15. a[i] += 1
  16. a[k] -= 1
  17. a[i+1..-1] = a[i+1..-1].reverse
  18. a
  19. end
  20. end
  21. def nexts(a)
  22. [a].tap {|b| b << a while a = next_or_nil(a)}
  23. end
  24.  
  25. ga = (1..20).map{|m| nexts(gm1(m))}
  26. g = ->m, n {puts "(#{m},#{n}) → #{(ga[m - 1][n - 1] || [0]).join}"}
  27.  
  28. g.(2,1)
  29. g.(2,2)
  30. g.(2,3)
  31. g.(20,1)
  32. g.(20,2)
  33. g.(20,3)
  34. g.(20,400096)
  35. g.(20,400097)
  36. #g.(32,1)
  37. #g.(32,2)
  38. #g.(32,3)
  39. #g.(32,1000)
  40. #g.(32,1000000)
  41. #g.(32,1000000000)
  42. #g.(32,1333610936)
  43. #g.(32,1333610937)
  44.  
Success #stdin #stdout 4.05s 282060KB
stdin
Standard input is empty
stdout
(2,1) → 2
(2,2) → 11
(2,3) → 0
(20,1) → 5555
(20,2) → 14555
(20,3) → 15455
(20,400096) → 11111111111111111111
(20,400097) → 0