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 sizemax = 0;
  15. int AB[nabmax][Dmax][2], C[Dmax];
  16. int nR2, R2[Dmax];
  17.  
  18. int main(void)
  19. {
  20. int a, b, g, i, j, k, r, r2, ra, rb;
  21.  
  22. for (D2 = n + 1, k = 0; k < 2; k++) {
  23. for (; D2 <= Dmax; D2++) {
  24. fill(rtoi2, rtoi2 + D2, 0);
  25. for (i = 1; i <= n; i++) {
  26. r = (long long)i * i * i % D2;
  27. if (rtoi2[r]) break; else rtoi2[r] = i;
  28. }
  29. if (i > n) break;
  30. }
  31. if (D2 > Dmax) return cout << "D not found." << endl, 1;
  32. if (k == 0) D = D2++, copy(rtoi2, rtoi2 + D, rtoi);
  33. }
  34. for (r = 0; r < D; r++) itor[rtoi[r]] = r;
  35. for (r = 0; r < D2; r++) itor2[rtoi2[r]] = r;
  36.  
  37. for (r = 1; r < D; r++) {
  38. fill(C, C + D2, 0);
  39. nR2 = 0;
  40. for (a = 2; a <= n; a++) {
  41. ra = itor[a];
  42. if ((rb = ra - r) < 0) rb += D;
  43. if (b = rtoi[rb], b == 0 || b >= a) continue;
  44. if ((r2 = itor2[a] - itor2[b]) < 0) r2 += D2;
  45.  
  46. if (C[r2] == nabmax) return cout << "Array out of range" << endl, 1;
  47. AB[C[r2]][r2][0] = a;
  48. AB[C[r2]][r2][1] = b;
  49. if (++C[r2] == m) R2[nR2++] = r2;
  50. }
  51.  
  52. for (g = 0; g < nR2; g++) {
  53. r2 = R2[g];
  54. k = C[r2];
  55. for (i = 0; i < k; i++) {
  56. a = AB[i][r2][0];
  57. b = AB[i][r2][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][r2][0] < AB[y][r2][0];});
  69. for_each(p + i, p + j, [&](int &x) {
  70. a = AB[x][r2][0];
  71. b = AB[x][r2][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.18s 5300KB
stdin
Standard input is empty
stdout
1412774811: (1134, 357), (1155, 504), (1246, 805), (2115, 2004), (4746, 4725)