#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 sizemax = 0;
int AB[nabmax][Dmax][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[C[r2]][r2][0] = a;
AB[C[r2]][r2][1] = b;
if (++C[r2] == m) R2[nR2++] = r2;
}
for (g = 0; g < nR2; g++) {
r2 = R2[g];
k = C[r2];
for (i = 0; i < k; i++) {
a = AB[i][r2][0];
b = AB[i][r2][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][r2][0] < AB[y][r2][0];});
for_each(p + i, p + j, [&](int &x) {
a = AB[x][r2][0];
b = AB[x][r2][1];
cout << (&x > p + i ? ", (" : "(") << a << ", " << b << ")";
});
cout << endl;
i = j - 1;
}
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBuID0gNTAwMDsKY29uc3QgaW50IG0gPSA1Owpjb25zdCBpbnQgRG1heCA9IG4gKyAxMDA7CmNvbnN0IGludCBuYWJtYXggPSAyNTsKCmludCBELCBEMiwgaXRvcltEbWF4XSA9IHt9LCBpdG9yMltEbWF4XSwgcnRvaVtEbWF4XSwgcnRvaTJbRG1heF07CmxvbmcgbG9uZyBkW25dOwppbnQgcFtuXTsKaW50IHNpemVtYXggPSAwOwppbnQgQUJbbmFibWF4XVtEbWF4XVsyXSwgQ1tEbWF4XTsKaW50IG5SMiwgUjJbRG1heF07CgppbnQgbWFpbih2b2lkKQp7CiAgICBpbnQgYSwgYiwgZywgaSwgaiwgaywgciwgcjIsIHJhLCByYjsKCiAgICBmb3IgKEQyID0gbiArIDEsIGsgPSAwOyBrIDwgMjsgaysrKSB7CiAgICAgICAgZm9yICg7IEQyIDw9IERtYXg7IEQyKyspIHsKICAgICAgICAgICAgZmlsbChydG9pMiwgcnRvaTIgKyBEMiwgMCk7CiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgICAgICByID0gKGxvbmcgbG9uZylpICogaSAqIGkgJSBEMjsKICAgICAgICAgICAgICAgIGlmIChydG9pMltyXSkgYnJlYWs7IGVsc2UgcnRvaTJbcl0gPSBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpID4gbikgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChEMiA+IERtYXgpIHJldHVybiBjb3V0IDw8ICJEIG5vdCBmb3VuZC4iIDw8IGVuZGwsIDE7CiAgICAgICAgaWYgKGsgPT0gMCkgRCA9IEQyKyssIGNvcHkocnRvaTIsIHJ0b2kyICsgRCwgcnRvaSk7CiAgICB9CiAgICBmb3IgKHIgPSAwOyByIDwgRDsgcisrKSBpdG9yW3J0b2lbcl1dID0gcjsKICAgIGZvciAociA9IDA7IHIgPCBEMjsgcisrKSBpdG9yMltydG9pMltyXV0gPSByOwoKICAgIGZvciAociA9IDE7IHIgPCBEOyByKyspIHsKICAgICAgICBmaWxsKEMsIEMgKyBEMiwgMCk7CiAgICAgICAgblIyID0gMDsKICAgICAgICBmb3IgKGEgPSAyOyBhIDw9IG47IGErKykgewogICAgICAgICAgICByYSA9IGl0b3JbYV07CiAgICAgICAgICAgIGlmICgocmIgPSByYSAtIHIpIDwgMCkgcmIgKz0gRDsKICAgICAgICAgICAgaWYgKGIgPSBydG9pW3JiXSwgYiA9PSAwIHx8IGIgPj0gYSkgY29udGludWU7CiAgICAgICAgICAgIGlmICgocjIgPSBpdG9yMlthXSAtIGl0b3IyW2JdKSA8IDApIHIyICs9IEQyOwoKICAgICAgICAgICAgaWYgKENbcjJdID09IG5hYm1heCkgcmV0dXJuIGNvdXQgPDwgIkFycmF5IG91dCBvZiByYW5nZSIgPDwgZW5kbCwgMTsKICAgICAgICAgICAgQUJbQ1tyMl1dW3IyXVswXSA9IGE7CiAgICAgICAgICAgIEFCW0NbcjJdXVtyMl1bMV0gPSBiOwogICAgICAgICAgICBpZiAoKytDW3IyXSA9PSBtKSBSMltuUjIrK10gPSByMjsKICAgICAgICB9CgogICAgICAgIGZvciAoZyA9IDA7IGcgPCBuUjI7IGcrKykgewogICAgICAgICAgICByMiA9IFIyW2ddOwogICAgICAgICAgICBrID0gQ1tyMl07CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspIHsKICAgICAgICAgICAgICAgIGEgPSBBQltpXVtyMl1bMF07CiAgICAgICAgICAgICAgICBiID0gQUJbaV1bcjJdWzFdOwogICAgICAgICAgICAgICAgZFtpXSA9IChsb25nIGxvbmcpYSAqIGEgKiBhIC0gKGxvbmcgbG9uZyliICogYiAqIGI7CiAgICAgICAgICAgICAgICBwW2ldID0gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb3J0KHAsIHAgKyBrLCBbXShpbnQgeCwgaW50IHkpIHtyZXR1cm4gZFt4XSA8IGRbeV07fSk7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgayAtIG0gKyAxOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChkW3BbaV1dICE9IGRbcFtpICsgbSAtIDFdXSkgY29udGludWU7CgogICAgICAgICAgICAgICAgY291dCA8PCBkW3BbaV1dIDw8ICI6ICI7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBpICsgbTsgaiA8IGsgJiYgZFtwW2pdXSA9PSBkW3BbaV1dOyBqKyspOwogICAgICAgICAgICAgICAgc29ydChwICsgaSwgcCArIGosIFsmXShpbnQgeCwgaW50IHkpIHtyZXR1cm4gQUJbeF1bcjJdWzBdIDwgQUJbeV1bcjJdWzBdO30pOwogICAgICAgICAgICAgICAgZm9yX2VhY2gocCArIGksIHAgKyBqLCBbJl0oaW50ICZ4KSB7CiAgICAgICAgICAgICAgICAgICAgYSA9IEFCW3hdW3IyXVswXTsKICAgICAgICAgICAgICAgICAgICBiID0gQUJbeF1bcjJdWzFdOwogICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgKCZ4ID4gcCArIGkgPyAiLCAoIiA6ICIoIikgPDwgYSA8PCAiLCAiIDw8IGIgPDwgIikiOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICAgICAgICAgICAgICBpID0gaiAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQ==