#include <iostream>
#include <algorithm>
using namespace std;
const int n = 5000;
const int m = 5;
const int Dmax = n + 100;
const int nabmax = 25;
int D, D2, itor[Dmax] = {}, itor2[Dmax], rtoi[Dmax], rtoi2[Dmax];
long long d[n];
int p[n];
int AB[Dmax][nabmax][2], C[Dmax];
int nR2, R2[Dmax];
int main(void)
{
int a, b, g, i, j, k, r, r2, ra, rb;
for (D2 = n + 1, k = 0; k < 2; k++) {
for (; D2 <= Dmax; D2++) {
fill(rtoi2, rtoi2 + D2, 0);
for (i = 1; i <= n; i++) {
r = (long long)i * i * i % D2;
if (rtoi2[r]) break; else rtoi2[r] = i;
}
if (i > n) break;
}
if (D2 > Dmax) return cout << "D not found." << endl, 1;
if (k == 0) D = D2++, copy(rtoi2, rtoi2 + D, rtoi);
}
for (r = 0; r < D; r++) itor[rtoi[r]] = r;
for (r = 0; r < D2; r++) itor2[rtoi2[r]] = r;
for (r = 1; r < D; r++) {
fill(C, C + D2, 0);
nR2 = 0;
for (a = 2; a <= n; a++) {
ra = itor[a];
if ((rb = ra - r) < 0) rb += D;
if (b = rtoi[rb], b == 0 || b >= a) continue;
if ((r2 = itor2[a] - itor2[b]) < 0) r2 += D2;
if (C[r2] == nabmax) return cout << "Array out of range" << endl, 1;
AB[r2][C[r2]][0] = a;
AB[r2][C[r2]][1] = b;
if (++C[r2] == m) R2[nR2++] = r2;
}
for (g = 0; g < nR2; g++) {
r2 = R2[g];
auto &ab = AB[r2];
k = C[r2];
for (i = 0; i < k; i++) {
a = ab[i][0];
b = ab[i][1];
d[i] = (long long)a * a * a - (long long)b * b * b;
p[i] = i;
}
sort(p, p + k, [](int x, int y) {return d[x] < d[y];});
for (i = 0; i < k - m + 1; i++) {
if (d[p[i]] != d[p[i + m - 1]]) continue;
cout << d[p[i]] << ": ";
for (j = i + m; j < k && d[p[j]] == d[p[i]]; j++);
sort(p + i, p + j, [&](int x, int y) {return ab[x][0] < ab[y][0];});
for_each(p + i, p + j, [&](int &x) {
a = ab[x][0];
b = ab[x][1];
cout << (&x > p + i ? ", (" : "(") << a << ", " << b << ")";
});
cout << endl;
i = j - 1;
}
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBuID0gNTAwMDsKY29uc3QgaW50IG0gPSA1Owpjb25zdCBpbnQgRG1heCA9IG4gKyAxMDA7CmNvbnN0IGludCBuYWJtYXggPSAyNTsKCmludCBELCBEMiwgaXRvcltEbWF4XSA9IHt9LCBpdG9yMltEbWF4XSwgcnRvaVtEbWF4XSwgcnRvaTJbRG1heF07CmxvbmcgbG9uZyBkW25dOwppbnQgcFtuXTsKaW50IEFCW0RtYXhdW25hYm1heF1bMl0sIENbRG1heF07CmludCBuUjIsIFIyW0RtYXhdOwoKaW50IG1haW4odm9pZCkKewogICAgaW50IGEsIGIsIGcsIGksIGosIGssIHIsIHIyLCByYSwgcmI7CgogICAgZm9yIChEMiA9IG4gKyAxLCBrID0gMDsgayA8IDI7IGsrKykgewogICAgICAgIGZvciAoOyBEMiA8PSBEbWF4OyBEMisrKSB7CiAgICAgICAgICAgIGZpbGwocnRvaTIsIHJ0b2kyICsgRDIsIDApOwogICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICAgICAgciA9IChsb25nIGxvbmcpaSAqIGkgKiBpICUgRDI7CiAgICAgICAgICAgICAgICBpZiAocnRvaTJbcl0pIGJyZWFrOyBlbHNlIHJ0b2kyW3JdID0gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaSA+IG4pIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoRDIgPiBEbWF4KSByZXR1cm4gY291dCA8PCAiRCBub3QgZm91bmQuIiA8PCBlbmRsLCAxOwogICAgICAgIGlmIChrID09IDApIEQgPSBEMisrLCBjb3B5KHJ0b2kyLCBydG9pMiArIEQsIHJ0b2kpOwogICAgfQogICAgZm9yIChyID0gMDsgciA8IEQ7IHIrKykgaXRvcltydG9pW3JdXSA9IHI7CiAgICBmb3IgKHIgPSAwOyByIDwgRDI7IHIrKykgaXRvcjJbcnRvaTJbcl1dID0gcjsKCiAgICBmb3IgKHIgPSAxOyByIDwgRDsgcisrKSB7CiAgICAgICAgZmlsbChDLCBDICsgRDIsIDApOwogICAgICAgIG5SMiA9IDA7CiAgICAgICAgZm9yIChhID0gMjsgYSA8PSBuOyBhKyspIHsKICAgICAgICAgICAgcmEgPSBpdG9yW2FdOwogICAgICAgICAgICBpZiAoKHJiID0gcmEgLSByKSA8IDApIHJiICs9IEQ7CiAgICAgICAgICAgIGlmIChiID0gcnRvaVtyYl0sIGIgPT0gMCB8fCBiID49IGEpIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKChyMiA9IGl0b3IyW2FdIC0gaXRvcjJbYl0pIDwgMCkgcjIgKz0gRDI7CiAgICAgICAgICAgIGlmIChDW3IyXSA9PSBuYWJtYXgpIHJldHVybiBjb3V0IDw8ICJBcnJheSBvdXQgb2YgcmFuZ2UiIDw8IGVuZGwsIDE7CiAgICAgICAgICAgIEFCW3IyXVtDW3IyXV1bMF0gPSBhOwogICAgICAgICAgICBBQltyMl1bQ1tyMl1dWzFdID0gYjsKICAgICAgICAgICAgaWYgKCsrQ1tyMl0gPT0gbSkgUjJbblIyKytdID0gcjI7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGcgPSAwOyBnIDwgblIyOyBnKyspIHsKICAgICAgICAgICAgcjIgPSBSMltnXTsKICAgICAgICAgICAgYXV0byAmYWIgPSBBQltyMl07CiAgICAgICAgICAgIGsgPSBDW3IyXTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykgewogICAgICAgICAgICAgICAgYSA9IGFiW2ldWzBdOwogICAgICAgICAgICAgICAgYiA9IGFiW2ldWzFdOwogICAgICAgICAgICAgICAgZFtpXSA9IChsb25nIGxvbmcpYSAqIGEgKiBhIC0gKGxvbmcgbG9uZyliICogYiAqIGI7CiAgICAgICAgICAgICAgICBwW2ldID0gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb3J0KHAsIHAgKyBrLCBbXShpbnQgeCwgaW50IHkpIHtyZXR1cm4gZFt4XSA8IGRbeV07fSk7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgayAtIG0gKyAxOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChkW3BbaV1dICE9IGRbcFtpICsgbSAtIDFdXSkgY29udGludWU7CgogICAgICAgICAgICAgICAgY291dCA8PCBkW3BbaV1dIDw8ICI6ICI7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBpICsgbTsgaiA8IGsgJiYgZFtwW2pdXSA9PSBkW3BbaV1dOyBqKyspOwogICAgICAgICAgICAgICAgc29ydChwICsgaSwgcCArIGosIFsmXShpbnQgeCwgaW50IHkpIHtyZXR1cm4gYWJbeF1bMF0gPCBhYlt5XVswXTt9KTsKICAgICAgICAgICAgICAgIGZvcl9lYWNoKHAgKyBpLCBwICsgaiwgWyZdKGludCAmeCkgewogICAgICAgICAgICAgICAgICAgIGEgPSBhYlt4XVswXTsKICAgICAgICAgICAgICAgICAgICBiID0gYWJbeF1bMV07CiAgICAgICAgICAgICAgICAgICAgY291dCA8PCAoJnggPiBwICsgaSA/ICIsICgiIDogIigiKSA8PCBhIDw8ICIsICIgPDwgYiA8PCAiKSI7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvdXQgPDwgZW5kbDsKICAgICAgICAgICAgICAgIGkgPSBqIC0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9