#include <stdio.h>

/* 関数のプロトタイプ宣言 */
long long int is_perfect(int);
int is_prime(long long int);
int is_sum_of_cube(long long int);
long long int cube(long long int);

#define MAX_NUM 1000
int list[MAX_NUM];

int main(){
  int i,j,k;
  long long int n;
  for(i=1; i<31; i++){
    /* 2^(n-1)Mnが完全数かどうかを確認 */
    if( !(n = is_perfect(i)) ) continue;
    /* 各完全数について奇数の3乗の和で表せるかを確認 */
    printf("完全数 %lld = ", n);
    j=is_sum_of_cube(n);
    if(j != -1){
      for (k=0; k<j; k++) 
        if (k==0) printf("%d^3 ",list[k] );
        else printf("+ %d^3 ",list[k] );
      printf("\n");
    }else{
      printf("NG\n");
    }
  }
  return 0;
}

/* Mn = 2^n - 1 が素数かどうかを確認し，2^(n-1)Mnが完全数かどうかを調べる関数 */
/* Mnが素数のとき，2^(n-1)Mnは完全数となり，また偶数の完全数はその形に限られる */
/* 完全数ならその値を，そうでないなら0を返す */
long long int is_perfect(int n){
  /* 1<<n = 2^n を利用 */
  long long int Mn = (1<<n) - 1;
  if(is_prime(Mn)) return Mn << (n-1);
  else return 0;
}

/* nが素数かどうかを判定する関数 */
/* 素数なら1，そうでないなら0を返す */
int is_prime(long long int n){
  /* 1は素数ではない */
  if(n < 2) return 0;

  /* sqrt(n)までのすべてのiで割りきれなければ素数 */
  long long int i;
  for(i=2; i*i<=n; i++){
    if(n%i==0) return 0;
  }
  return 1;
}



/* nが奇数の自然数の3乗の和で表せるかどうかを返す関数 */
/* できる場合は表す個数(0がlistの一個目)，できない場合は-1を返す */
int is_sum_of_cube(long long int n){
  long long int i;
  int ct=0;
  for(i=1; n>0; i+=2){
    /* nから奇数の3乗を引いていき，0になればよい */
    n -= cube(i);
    list[ct++]=i;
    if(n == 0){
      return ct;
    }
  }
  return -1;
}

/* nの3乗を返す関数 */
long long int cube(long long int n){
  return n*n*n;
}
