#pragma GCC target ("sse4.2")
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define ln "\n"
#define forn(i,e) for( i=0; i<e; i++)
#define forsn(i,s,e) for( i=s; i<e; i++)
#define rforn(i,e) for( i=e; i>=0; i--)
#define vasort(v)         sort(v.begin(), v.end());
#define vdsort(v)         sort(v.begin(), v.end(),greater<ll>());
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define out1(x1) cout << x1 << ln
#define out2(x1,x2) cout << x1 << " " << x2 << ln
#define out3(x1,x2,x3) cout << x1 << " " << x2 << " " << x3 << ln
#define out4(x1,x2,x3,x4) cout << x1 << " " << x2 << " " << x3 << " " << x4 << ln


#define in1(x1) cin >> x1
#define in2(x1,x2) cin >> x1 >> x2
#define in3(x1,x2,x3) cin >> x1 >> x2 >> x3
#define in4(x1,x2,x3,x4) cin >> x1 >> x2 >> x3 >> x4

#define arrin(a, n) forn(i, n) cin >> a[i];
#define arrout(a,n) forn(i,n) {cout << a[i] << " ";} cout << ln;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int dr[] = {0,1,-1,0,1,-1,1,-1};
int dc[] = {1,0,0,-1,1,-1,-1,1};
bool chk(int a, int b, int n, int m) {
        return 0 <= a && a < n && 0 <= b && b < m;
}

ll exp(ll n, ll m, ll md){
        ll a = 1;
        while (m > 0){
                if (m&1) a = (a * n%md) % md;
                m /= 2;
                n = (n*n) % md;
        }
        return a % md;
}

void disp(vi v){
        for(auto u:v)
                cout<<u<<" ";
        cout<<"\n";
}

int getSqr(int x){
        if(x < 0)
                return -1;
        int l = sqrt(x);
        for (int i = -2; i <= 2; ++i)
                if (l + i >= 0 && (l + i) * (l + i) == x)
                        return l;
        return -1;
}

#define DEBUG
#ifdef DEBUG

#endif
const int NPRR = 1e7;
vi lp;
vector<int> pr;
void prfac(int n = NPRR){
        assert(n <= NPRR);
        lp.assign(n+1, 0);
        int i;
        for (i = 2;i <= n;++i) {
                if (lp[i] == 0) {
                        lp[i] = i;
                        pr.push_back(i);
                }
                for (int u: pr) {
                        if(i * u > n || u > lp[i]) break;
                        lp[i * u] = u;
                }
        }
}
/*

const ll N = 1e5 + 1;
ll a[N];
ll mxx[N];
ll ans = 0;
ll n, x;
ll dp(ll l, ll xx) {
        if(l >= n) return 0;
        if(xx == a[l]) {
                return 1 + dp(l+1, xx*2);
        }

        if(xx > a[l]) {
                if(xx > a[l]*2) {
                        return dp(l+1, xx);
                }
                else {
                        return 1 + dp(l+1, 2*a[l]);
                }

        }
        if(xx < a[l]) {
                a[l] -= xx;
                a[l] *= 2;
                a[l] = min(a[l], mxx[l]);
                return 1 + dp(l, xx*2);
        }

}


void go2() {
        in2(n, x);
        ll i, j, k;
        ans = 0;
        forn(i, n) {
                cin >> a[i];
                mxx[i] = a[i];
        }
        sort(a, a+n);

        i = 0;
        while(i < n && a[i] < x) {
                i++;
                ans++;
        }
        if(i == n) {
                cout << ans << ln;
                return;
        }
}
*/

bool check_composite_for_prime_function(ll n, ll a, ll d, int s){
        ll x = exp(a, d, n);
        if (x == 1 || x == n-1) return false;
        for(int r = 1;r < s;++r){
                x = x * x%n;
                x %= n;
                if(x == n-1) return false;
        }
        return true;
}
bool prime(ll n){
        if(n < 4) return n == 2 || n == 3;
        if (!(n&1)) return false;
        int s = 0;
        ll d = n-1;
        while(!(d&1)){
                d >>= 1;
                s++;
        }
        for(int a : {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37}){
                if(n == a) return true;
                if(check_composite_for_prime_function(n, a, d, s)) return false;
        }
        return true;
}



const int N = 300;
int lk[N];
int sz[N];
int n,m;
int find(int i) {
        while(i != lk[i]) i = lk[i];
        return i;
}

void unite(int s, int r) {

        if(s >= n || r >= n) {
                if(s < n) swap(s, r);
                if(find(s) == s) {
                        lk[s] = r;
                        sz[r]++;
                        return;
                }
        }

        s = find(s);
        r = find(r);
        if(s == r) return;
        if(sz[s] < sz[r]) swap(s, r);
        lk[r] = s;
        sz[s] += sz[r];
}

void go1() {
        int i, j, k;
        in2(n,m);
        forn(i, 2*n) {
                lk[i] = i;
                sz[i] = 1;
        }
        forn(i, n) {
                int r;
                cin>>r;
                forn(j, r) {
                        int t;
                        cin >> t;
                        t--;
                        t += n;
                        unite(t, i);
                }
        }
        set<int> s;
        forn(i, n) {
                s.insert(find(i));
        }
        //for(int u: s) cout << u << " ";
        cout << s.size() - 1 << ln;
}


vector<int> ad[100001];
int sub[100001];
int o = 0, e = 0;
int dfs(int s, int e) {
        int ans = 1;
        for(int u: ad[s]) {
                if(u == e) continue;
                ans += dfs(u, s);
        }
        sub[s] = ans;
        return ans;
}
int mx = 0;
void dfs1(int s, int r) {
        mx = max(mx, e);
        for(int u:ad[s]) {

        }
}


void go2() {
        int n;
        cin >> n;
        ad->assign(n, {});
        int i, j,k;
        forn(i, n) {
                int r,s;
                in2(r, s);
                r--;s--;
                ad[r].PB(s);
                ad[s].PB(r);
        }
        dfs(0, 0);
        forn(i, n) {
                if(sub[i] & 1) o++;
                else e++;
        }



}

void go3() {

        ll  i, j, k, n;
        cin >> n;
        ll ans[n+1];
        forn(i, n+1) ans[i] =0 ;
        /*forsn(i,2, 103) {
                forsn(j, 2,103) {
                        forsn(k, 2,103) {
                                int l = i+j+k;
                                if(l % 2 == 0) {
                                        if(l/2 > i && l/2 > j && l/2 > k) {
                                                if(i*i + j*j + k*k <= 2*n) {
                                                        if((i*i + j*j + k*k) % 2 == 0) {
                                                                ans[(i * i + j * j + k * k) / 2]++;
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }*/

        forsn(i, 1, 103) {
                forsn(j, 1, 103) {
                        forsn(k, 1, 103) {
                                ll a = ((i+j)*(i+j) + (j+k)*(j+k) + (k+i)*(k+i)) / 2;
                                if(a <= n) {
                                        ans[a]++;
                                }
                        }
                }
        }

        forsn(i, 1, n+1) {
                out1(ans[i]);
        }

}


int main(){
        fio;
        //freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
        chrono::high_resolution_clock::time_point start = chrono::high_resolution_clock::now();

        ll tt = 1;


/*
        cin >> tt;


        //*/
        cout<<fixed<<setprecision(10);
        while(tt--){

                go3();
        }

        chrono::high_resolution_clock::time_point end = chrono::high_resolution_clock::now();
        long double time_spent = (chrono::duration_cast<chrono::duration<long double> >(end-start)).count();
        //double time_taken = time_spent / double(CLOCKS_PER_SEC);
        cerr<<time_spent<<'\n';
        return 0;
}

Measured memory_bytes: 6180