fork download
  1. #include <iostream>
  2. #include <algorithm>
  3.  
  4. using namespace std;
  5.  
  6. const int n = 5000;
  7. const int m = 5;
  8. const int Dmax = n + 100;
  9. const int nabmax = 25;
  10.  
  11. int D, D2, itor[Dmax] = {}, itor2[Dmax], rtoi[Dmax], rtoi2[Dmax];
  12. long long d[n];
  13. int p[n];
  14. int AB[Dmax][nabmax][2], C[Dmax];
  15. int nR2, R2[Dmax];
  16.  
  17. int main(void)
  18. {
  19. int a, b, g, i, j, k, r, r2, ra, rb;
  20.  
  21. for (D2 = n + 1, k = 0; k < 2; k++) {
  22. for (; D2 <= Dmax; D2++) {
  23. fill(rtoi2, rtoi2 + D2, 0);
  24. for (i = 1; i <= n; i++) {
  25. r = (long long)i * i * i % D2;
  26. if (rtoi2[r]) break; else rtoi2[r] = i;
  27. }
  28. if (i > n) break;
  29. }
  30. if (D2 > Dmax) return cout << "D not found." << endl, 1;
  31. if (k == 0) D = D2++, copy(rtoi2, rtoi2 + D, rtoi);
  32. }
  33. for (r = 0; r < D; r++) itor[rtoi[r]] = r;
  34. for (r = 0; r < D2; r++) itor2[rtoi2[r]] = r;
  35.  
  36. for (r = 1; r < D; r++) {
  37. fill(C, C + D2, 0);
  38. nR2 = 0;
  39. for (a = 2; a <= n; a++) {
  40. ra = itor[a];
  41. if ((rb = ra - r) < 0) rb += D;
  42. if (b = rtoi[rb], b == 0 || b >= a) continue;
  43.  
  44. if ((r2 = itor2[a] - itor2[b]) < 0) r2 += D2;
  45. if (C[r2] == nabmax) return cout << "Array out of range" << endl, 1;
  46. AB[r2][C[r2]][0] = a;
  47. AB[r2][C[r2]][1] = b;
  48. if (++C[r2] == m) R2[nR2++] = r2;
  49. }
  50.  
  51. for (g = 0; g < nR2; g++) {
  52. r2 = R2[g];
  53. auto &ab = AB[r2];
  54. k = C[r2];
  55. for (i = 0; i < k; i++) {
  56. a = ab[i][0];
  57. b = ab[i][1];
  58. d[i] = (long long)a * a * a - (long long)b * b * b;
  59. p[i] = i;
  60. }
  61. sort(p, p + k, [](int x, int y) {return d[x] < d[y];});
  62.  
  63. for (i = 0; i < k - m + 1; i++) {
  64. if (d[p[i]] != d[p[i + m - 1]]) continue;
  65.  
  66. cout << d[p[i]] << ": ";
  67. for (j = i + m; j < k && d[p[j]] == d[p[i]]; j++);
  68. sort(p + i, p + j, [&](int x, int y) {return ab[x][0] < ab[y][0];});
  69. for_each(p + i, p + j, [&](int &x) {
  70. a = ab[x][0];
  71. b = ab[x][1];
  72. cout << (&x > p + i ? ", (" : "(") << a << ", " << b << ")";
  73. });
  74. cout << endl;
  75. i = j - 1;
  76. }
  77. }
  78. }
  79. return 0;
  80. }
Success #stdin #stdout 0.17s 5304KB
stdin
Standard input is empty
stdout
1412774811: (1134, 357), (1155, 504), (1246, 805), (2115, 2004), (4746, 4725)