prog.sf 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/ruby
  2. # a(n) is the smallest positive integer which can be represented as the sum of distinct positive Fibonacci n-step numbers (with a single type of 1) in exactly n ways, or -1 if no such integer exists.
  3. # https://oeis.org/A359631
  4. # Known terms:
  5. # 1, 3, 44, 416, 26815, 464031
  6. func isok(n, k) {
  7. var arr = []
  8. Inf.times {|j|
  9. var t = j.fib(k)
  10. if (t <= n) {
  11. arr << t
  12. }
  13. else {
  14. break
  15. }
  16. }
  17. arr.uniq!
  18. arr.grep!{_>0}
  19. #~ var s = Set(arr...)
  20. var sol = []
  21. for k in (0..arr.len) {
  22. arr.combinations(k, {|*a|
  23. if (a.sum == n) {
  24. sol << a
  25. }
  26. #~ with (n - a.sum) {|d|
  27. #~ if (s.has(d) && !a.has(d)) {
  28. #~ sol << a
  29. #~ }
  30. #~ }
  31. })
  32. }
  33. #~ arr.combinations(k-1, {|*a|
  34. #~ with (n - a.sum) {|d|
  35. #~ if (s.has(d) && !a.has(d)) {
  36. #~ sol << a
  37. #~ }
  38. #~ }
  39. #~ })
  40. sol.map {|a| [a..., n - a.sum].sort }.uniq
  41. }
  42. func a(n) {
  43. for k in (1..Inf) {
  44. var sol = isok(k, n)
  45. if (sol.len == n) {
  46. return [n, k]
  47. }
  48. elsif (sol.len > n) {
  49. say "[#{n}] Found #{sol.len} solutions for k = #{k}..."
  50. }
  51. }
  52. }
  53. for k in (2..100) {
  54. say a(k)
  55. }
  56. __END__
  57. [2, 3]
  58. [3, 44]
  59. [4, 416]