#include <stdio.h>
#include <math.h>
#define MAX_NUM 100

/* 関数のプロトタイプ宣言 */
long long int triangle(long long int);
int is_triangle(long long int);
int is_sum_of_two_triangles(long long int);

int main(){
  long long int i,n, n4;
  int j,k;

  srand((unsigned)time(NULL));

  for(i=0; i < MAX_NUM; i++){
    /* n^4が三角数の和で表せるかを確認 */
    n = rand()%1000;
    if (n<2) continue;
    n4 = n*n*n*n;
    if(j=is_sum_of_two_triangles(n4)){
        k = is_triangle(n4 - triangle(j));
        printf("%lld^4 = %lld is a sum of 2 triangle numbers, i.e., (%d*(%d+1)/2)+(%d*(%d+1)/2).\n",n, n4,j,j,k,k);
    }else{
        printf("%lld^4 = %lld is not the sum of 2 triangle numbers.\n", n, n4);
        return 0;
    }
  }
  printf("All OK\n");
  return 0;
}

/* n番目の三角数を返す関数 */
/* n番目の三角数は，n(n+1)/2 で表される */
long long int triangle(long long int n){
 return n*(n+1)/2;
}

/* nが三角数かどうかを返す関数 */
/* 三角数なら1，そうでないなら0を返す */
int is_triangle(long long int n){
  /* i(i+1)/2=n　を解くと，i=-1/2+sqrt(1/4+2n) */
  long long int i = sqrt(0.25+2*n)-0.5;
  if(triangle(i) == n) return i;
  return 0;
}

/* nが2つの三角数の和で表せるかどうかを返す関数 */
/* 表せるなら1，そうでないなら0を返す */
int is_sum_of_two_triangles(long long int n){
  long long int i,j;
  for(i=1; triangle(i) < n; i++){
    /* nから三角数を引いたものが三角数となればよい */
    if(j=is_triangle(n - triangle(i))){
      return j;
    }
  }
  return 0;
}
