x.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. Daniel "Trizen" Suteu
  3. Date: 26 March 2019
  4. https://github.com/trizen
  5. Compute terms of the A307069 OEIS sequence.
  6. Defintion by Elliott Line, Mar 22 2019:
  7. Given a special version of Pascal's triangle where only Fibonacci numbers are
  8. permitted, a(n) is the row number in which the n-th Fibonacci number first appears.
  9. */
  10. #include <set>
  11. #include <iostream>
  12. #include <vector>
  13. #include <algorithm>
  14. using namespace std;
  15. int main(int argc, char **argv) {
  16. set <int> is_fib;
  17. set <int> seen;
  18. is_fib.insert(1);
  19. is_fib.insert(2);
  20. is_fib.insert(3);
  21. is_fib.insert(5);
  22. is_fib.insert(8);
  23. is_fib.insert(13);
  24. is_fib.insert(21);
  25. is_fib.insert(34);
  26. is_fib.insert(55);
  27. is_fib.insert(89);
  28. is_fib.insert(144);
  29. is_fib.insert(233);
  30. is_fib.insert(377);
  31. is_fib.insert(610);
  32. is_fib.insert(987);
  33. is_fib.insert(1597);
  34. is_fib.insert(2584);
  35. is_fib.insert(4181);
  36. is_fib.insert(6765);
  37. is_fib.insert(10946);
  38. vector <int> row;
  39. row.push_back(1);
  40. auto end_of_fib = is_fib.end();
  41. auto end_of_seen = seen.end();
  42. bool printed_row = false;
  43. for (int n = 1; n < 10000000 ; ++n) {
  44. if (n % 10000 == 0) {
  45. printf("Processing row %d...\n", n);
  46. }
  47. vector <int> t;
  48. vector <int> fibs;
  49. int upper = ((n - (n % 2)) >> 1) - 1;
  50. for (int j = 0; j <= upper; ++j) {
  51. int v = row[j] + row[j + 1];
  52. //~ if (v == 610) {
  53. //~ printf("Found 610 on line %d\n", n);
  54. //~ }
  55. if ((v == 1) || (v == 2) || (v == 3) || (v == 5) || (is_fib.find(v) != end_of_fib)) {
  56. if (seen.find(v) == end_of_seen) {
  57. seen.insert(v);
  58. fibs.push_back(v);
  59. end_of_seen = seen.end();
  60. }
  61. t.push_back(v);
  62. }
  63. else {
  64. t.push_back(1);
  65. }
  66. }
  67. //~ if (n <= 10) {
  68. //~ for (auto k : row) {
  69. //~ printf("%d ", k);
  70. //~ }
  71. //~ printf("\n");
  72. //~ }
  73. vector <int> v;
  74. v.resize(t.size());
  75. reverse_copy(t.begin(), t.end(), v.begin());
  76. if (n % 2 == 0) {
  77. v.erase(v.begin());
  78. }
  79. for (int k : fibs) {
  80. printf("%d -> first appears in row %d\n", k, n);
  81. if (n > 2544 && !printed_row) {
  82. printf("The row is: \n");
  83. for (int z : row) {
  84. printf("%d ", z);
  85. }
  86. printf("\n");
  87. printed_row = true;
  88. printf("%d -> first appears in row %d\n", k, n);
  89. }
  90. }
  91. row.clear();
  92. row.reserve(t.size() + v.size() + 2);
  93. row.insert(row.end(), t.begin(), t.end());
  94. row.insert(row.end(), v.begin(), v.end());
  95. row.push_back(1);
  96. row.insert(row.begin(), 1);
  97. }
  98. return 0;
  99. }