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 Rust (1.42.0) (judge verdict: Accepted)

#[allow(unused_imports)]
use std::collections::*;
#[allow(unused_imports)]
use std::iter::FromIterator;

fn main() {
    let mut reader = acio::Reader::from_stdin();
    let n: usize = reader.read();
    let mut dp = vec![0; n + 1];
    for x in 1..=n {
        let v = x * x + 1 + 1 + x + 1 + x;
        if n < v {
            break;
        }
        for y in 1..=x {
            let v = x * x + y * y + 1 + x * y + y + x;
            if n < v {
                break;
            }
            for z in 1..=y {
                let v = x * x + y * y + z * z + x * y + y * z + z * x;
                if n < v {
                    break;
                }
                let c = if x == y && y == z {
                    1
                } else if x == y || y == z {
                    3
                } else {
                    6
                };
                dp[v] += c;
                //println!("{:?} = {} ({})", (x, y, z), v, c);
            }
        }
    }
    for i in 1..=n {
        println!("{}", dp[i]);
    }
}

//-- MODULES --

/// Mathematics Module
#[allow(dead_code)]
mod math {
    use std::mem::swap;

    /// Methods for Each Integer Type
    pub trait Integer {}
    /// Implements trait Integer
    macro_rules! integer {
        ($t:ty) => {
            impl Integer for $t {}
        };
    }

    /// Methods for Each Natural Integer Type
    pub trait Natural {
        fn lcm(v1: Self, v2: Self) -> Self;
        fn gcd(v1: Self, v2: Self) -> Self;
        fn fact(n: Self) -> Self;
        fn perm(n: Self, k: Self) -> Self;
        fn comb(n: Self, k: Self) -> Self;
    }
    /// Implements trait Natural
    macro_rules! natural {
        ($t:ty) => {
            impl Natural for $t {
                fn lcm(v1: $t, v2: $t) -> $t {
                    v1 * v2 / Self::gcd(v1, v2)
                }

                fn gcd(v1: $t, v2: $t) -> $t {
                    let (mut v1, mut v2) = (v1, v2);
                    if v1 < v2 {
                        swap(&mut v1, &mut v2);
                    }
                    while v2 != 0 {
                        let t = v1;
                        v1 = v2;
                        v2 = t % v2;
                    }
                    return v1;
                }

                fn fact(n: $t) -> $t {
                    let mut a = 1;
                    for i in 1..=n {
                        a *= i;
                    }
                    return a;
                }

                fn perm(n: $t, k: $t) -> $t {
                    Self::fact(n) / Self::fact(n - k)
                }

                fn comb(n: $t, k: $t) -> $t {
                    Self::perm(n, k) / Self::fact(k)
                }
            }
        };
    }

    // BEGIN DECLARATIONS
    integer!(i8);
    integer!(i16);
    integer!(i32);
    integer!(i64);
    integer!(isize);
    integer!(u8);
    integer!(u16);
    integer!(u32);
    integer!(u64);
    integer!(usize);
    // ---
    natural!(u8);
    natural!(u16);
    natural!(u32);
    natural!(u64);
    natural!(usize);
    // END DECLARATIONS
}

/// IO Module for AtCoder
#[allow(dead_code)]
mod acio {
    use std::fmt::Debug;
    use std::io::{stdin, BufRead, BufReader, Read, Stdin};
    use std::str::FromStr;

    /// Multi-Purpose Value Reader
    pub struct Reader<R>
    where
        R: Read,
    {
        input: BufReader<R>,
        stack: Vec<String>,
    }

    impl<R: Read> Reader<R> {
        /// Create Reader from Read
        pub fn new<T>(input: R) -> Self {
            // Self { // <- Warning: NOT YET on AtCoder
            Reader {
                input: BufReader::new(input),
                stack: vec![],
            }
        }

        /// Read Multiple Value
        pub fn read_by<F>(&mut self, count: usize) -> Vec<F>
        where
            F: FromStr,
            <F as FromStr>::Err: Debug,
        {
            (0..count).map(|_| self.read()).collect()
        }

        /// Read Single Value
        pub fn read<F>(&mut self) -> F
        where
            F: FromStr,
            <F as FromStr>::Err: Debug,
        {
            while self.stack.is_empty() {
                let mut line = self.read_line();
                self.stack.append(&mut line);
                self.stack.reverse();
            }
            self.stack.pop().unwrap().parse().unwrap()
        }

        /// Read Space Split Line
        fn read_line(&mut self) -> Vec<String> {
            let mut buf = String::new();
            self.input.read_line(&mut buf).unwrap();
            buf.split_whitespace().map(|s| s.to_string()).collect()
        }
    }

    impl Reader<Stdin> {
        /// Create Reader from stdin
        pub fn from_stdin() -> Self {
            Self::new::<Reader<Stdin>>(stdin())
        }
    }

    /*
    impl<T> Drop for Reader<T> {
        /// FOR DEBUG
        fn drop(&mut self) {
            if self.stack.len() != 0 {
                panic!("Reader with remaining value is dropped.")
            }
        }
    }
    */
}