/*
2002/02 3乗数の和
coded by Isaku WADA
 ┌─────────────────────────────┐
 │ 1729は,2つの3乗数(ある数の3乗になっている数)の和で2│
 │通りに書ける数の最小のものである。            │
 │  1729 = 1^3 + 12^3 = 9^3 + 10^3           │
 │ では,「2つの3乗数の和で3通りに書ける数の最小のもの」│
 │を見つけていただきたい。なお,ここでは正の整数のみを扱う。│
 └─────────────────────────────┘
 ┌──────────────┬─────┬───────┐
 │コンパイラ          │実行時間 │ファイルサイズ│
 ├──────────────┼─────┼───────┤
 │Microsoft Visual C++ 6.0    │0.08015 秒│  36864 byte  │
 │Microsoft Visual C++ .NET   │0.05296 秒│  45056 byte  │
 │Borland C++ 5.5.1 for Win32 │0.09203 秒│  53760 byte  │
 │gcc-2.953(djgpp)            │0.06209 秒│ 107863 byte  │
 │gcc-2.953(cygwin)           │0.05906 秒│  19086 byte  │
 │LSI C-86 Ver 3.30 試食版  │0.29100 秒│ 13414 byte │
 │Turbo C Ver 1.5(small model)│0.28000 秒│ 10884 byte │
 └──────────────┴─────┴───────┘
    CPU:Pentium4 2.52GHz       OS:Windows XP
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 445

/*┌──────┐
 │パズルを解く│
 └──────┘*/
void Solve(void)
{
    int i,a,b,c,d,e,f;   /* a^3+b^3 = c^3+d^3 = e^3+f^3 */
    long a3,b3,c3,d3;    /* a3=a^3, b3=b^3, c3=c^3, d3=d^3 */
    long a3b3,c3d3,e3f3; /* a3b3=a3+b3, c3d3=c3+d3, e3f3=e3+f3 */
    static long tbl[N+1];

    for(i=0;i<=N;i++) tbl[i]=(long)i*i*i;
    for(f=3;f<=N-2;f++) for(e=3;e<=f;e++) {
        e3f3=tbl[e]+tbl[f]; c3=tbl[c=e-1]; d3=tbl[d=f+1];
        for(;;) {
            if ((c3d3=c3+d3)==e3f3) {
                a3=tbl[a=c-1]; b3=tbl[b=d+1];
                for(;;)
                if ((a3b3=a3+b3)==e3f3) {
                    printf("%d^3+%d^3 = %d^3+%d^3 = ",a,b,c,d);
                    printf("%d^3+%d^3 = %ld\n",e,f,e3f3);
                    return;
                }else
                    if (a3b3>e3f3) if (--a<1) break; else a3=tbl[a];
                    else           if (++b>N) break; else b3=tbl[b];
            }
            if (c3d3>e3f3) if (--c<2)  break; else c3=tbl[c];
            else           if (++d>=N) break; else d3=tbl[d];
        }
    }
}

/*┌────────────────────┐
 │MS-DOS コンパイラ用のシンプルな clock() │
 └────────────────────┘*/
#if CLOCKS_PER_SEC == 1
#undef CLOCKS_PER_SEC
#endif
#ifndef CLOCKS_PER_SEC
#define CLOCKS_PER_SEC 1000
#include <dos.h>
static long clock(void) {
    union REGS t; t.h.ah=0x2c; intdos(&t,&t);
    return t.h.dl*10L+t.h.dh*1000L+t.h.cl*60000L+t.h.ch*3600000L;
}
#endif

/*┌───────┐
 │メインルーチン│
 └───────┘*/
int main(int argc,char**argv)
{
    double StartTime=clock(); int i,num;

    if (argc==2) num=atoi(argv[1]); else num=1;
    for (i=0;i<num;i++) Solve();
    printf("実行時間 %.3f 秒\n",(clock()-StartTime)/CLOCKS_PER_SEC);
    return 0;
}