Problem:
Score : 300 points

Problem Statement

Let f(n) be the number of triples of integers (x,y,z) that satisfy both of the following conditions:

1 \leq x,y,z

x^2 + y^2 + z^2 + xy + yz + zx = n

Given an integer N, find each of f(1),f(2),f(3),\ldots,f(N).

Constraints

All values in input are integers.

1 \leq N \leq 10^4

Input

Input is given from Standard Input in the following format:

N

Output

Print N lines. The i-th line should contain the value f(i).

Sample Input 1

20

Sample Output 1

0
0
0
0
0
1
0
0
0
0
3
0
0
0
0
0
3
3
0
0

For n=6, only (1,1,1) satisfies both of the conditions. Thus, f(6) = 1.

For n=11, three triples, (1,1,2), (1,2,1), and (2,1,1), satisfy both of the conditions. Thus, f(6) = 3.

For n=17, three triples, (1,2,2), (2,1,2), and (2,2,1), satisfy both of the conditions. Thus, f(17) = 3.

For n=18, three triples, (1,1,3), (1,3,1), and (3,1,1), satisfy both of the conditions. Thus, f(18) = 3.

Solution in C (GCC 9.2.1) (judge verdict: Accepted)

#include <stdio.h>
#include <math.h>

int calc(int x,int y, int z){
  int ans;
  ans = x*x + y*y + z*z + x*y + x*z + y*z;
  return ans;
}

int main(){
  int n;
  int index;
  int i,j,k;
  int b_1,b_2,b_3,b_4;
  int index_break;
  int ans;
  double tmp;
  scanf("%d",&n);
  int cnt[n+1];
  for(i=1;i<=n;i++){
    cnt[i]=0;
  }
  i=1;
  while(1){
     ans = 1+1+i*i+1+i+i;
     i++;
     if(ans > n){
       index_break=i;
       break;
     }
  }
  /*
  //区分1(3個とも数字が違う場合)
  b_1 = n/3;
  b_2 = 2*n/3;
  //区分２(3個とも数字が同じ場合)
  tmp = n/6;
  b_3 = sqrt(tmp);
  //区分２(2個だけ数字が同じ場合)
*/

  for(i=1;i<=index_break;i++){
    for(j=1;j<=index_break;j++){
      for(k=1;k<=index_break;k++){
        index=calc(i,j,k);
        if(index<=n){
        cnt[index]+=1;
      }
      }
    }
  }
/*

//３個とも同じ数のとき
for(i=1;i<=b_3;i++){
  index=calc(i,i,i);
  if(index<=n){
  cnt[index]+=1;
  }
}
//2個とも同じ数のとき
for(i=1;i<=b_1;i++){
  for(j=b_1+1;j;j--){

  index=calc(i,j,j);
  if(index<=n){
  cnt[index]+=3;
  }
}
}

//３個とも違う場合
  for(i=1;i<=b_1;i++){
    for(j=b_1+1;j<=b_2;j++){
      for(k=b_2+1;k<n;k++){
        index=calc(i,j,k);
        if(index<=n){
        cnt[index]+=6;
      }
      }
    }
  }
  */
  for(i=1;i<=n;i++){
    printf("%d\n",cnt[i]);
  }

  return 0;
}