#include<stdio.h>
/* 22^3=10648なので，解として現れるのは21^3まで */
#define LIMIT 21
#define MAX_INT 10000
main()
{
  int cube[LIMIT];              /* cube[i]にiの３乗を保存 */
  int sum_of_cube[LIMIT][LIMIT]; /* 立法数の和を保存する */
  int i,j,m,n;                  /* ループカウンタ */
  int flag;                     /* 3つの表し方がないかの判断フラグ */
  int target;                   /* 総当り探索で使用 */
  int answer,a1,a2,b1,b2;       /* 見つかった解を保存する変数 */
  /* cubeに値を埋める */
  for(i = 0;i < LIMIT;i++){
    cube[i] = (i+1)*(i+1)*(i+1);
  }
  /* sum_of_cubeに値を埋める */
  for(i=0;i<LIMIT;i++)
    for(j=i;j<LIMIT;j++)
      sum_of_cube[i][j] = cube[i]+cube[j];
  /* ここから総当りでsum_of_cubeに同じ数が含まれているか探索し，かつその中で最小の数を探す */
  /* はじめにanswerには大きい数を入れておいて，後から見つかった解と入れ替える */  answer = MAX_INT;
  for(i=0;i<LIMIT;i++){
     for(j=i;j<LIMIT;j++){
      target = sum_of_cube[i][j];
      flag = 0;
      /* targetと同じ値を配列中から探す */
      for(m=0;m<LIMIT;m++){
        for(n=m;n<LIMIT;n++){
          if(target == sum_of_cube[m][n] && /* 配列中にtargetと同じ値が見つかったときに */
              target < answer && /* すでに見つかっている解より小さくて */
              i != m && j != n){ /* 実はtargetと同じマスを見ているだけ，ということでなければそれが見つけるべき解! */
            if (flag) continue; /* 3つ目の表し方なので駄目 */
            answer = target;
            a1 = i+1;
            a2 = j+1;
            b1 = m+1;
            b2 = n+1;
            flag = 1;
          }
        if (flag) continue;
        }
      if (flag) continue;
      }
    }
  }
  /* 総当り終了，結果表示 */
  printf("answer:%d = %d ^ 3 + %d ^ 3 = %d ^ 3 + %d ^ 3\n",
          answer,a1,a2,b1,b2);
}
