/*
 * Copyright (c) 2004 Kamo Hiroyasu
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*
 *  A solution of "Lagrange's Four-Square Theorem"
 *   Author: Kamo Hiroyasu <wd@ics.nara-wu.ac.jp>
 */

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

#define MAXINPUT	32767

#ifdef DEBUG
#define INPUT_FILE	"/dev/stdin"
#else
#define INPUT_FILE	"lagrange.txt"
#endif

void
isqrt(unsigned x, unsigned *q, unsigned *r)
{
	unsigned	y, h, a;

	y = 0;
	for (h = 1U << ((sizeof(unsigned) * CHAR_BIT - 1) / 2); h > 0; h /= 2) {
		a = (h + y * 2) * h;
		if (x >= a) {
			x -= a;
			y += h;
		}
	}
	*q = y;
	*r = x;
}

unsigned
floor_sqrt(unsigned x)
{
	unsigned	y, z;

	isqrt(x, &y, &z);
	return y;
}

unsigned
sqrtrem(unsigned x)
{
	unsigned	y, z;

	isqrt(x, &y, &z);
	return z;
}

unsigned
foursq(unsigned x)
{
	unsigned	i, j, k;
	unsigned	y, z;
	unsigned	a, b, c;
	unsigned	s = 0;

	for (a = floor_sqrt(x / 4), i = 0; i <= a; i ++) {
		y = x - i * i;
		for (b = floor_sqrt(y / 3), j = i; j <= b; j ++) {
			z = y - j * j;
			for (c = floor_sqrt(z / 2), k = j; k <= c; k ++) {
				if (sqrtrem(z - k * k) == 0) {
					s ++;
				}
			}
		}
	}
	return s;
}

main(int argc, char *argv[])
{
	FILE		*fp;
	const char	*path;
	unsigned	n;

	switch (argc) {
	case 1:
		path = INPUT_FILE;
		break;
	case 2:
		path = argv[1];
		break;
	default:
		return 1;
	}

	if ((fp = fopen(path, "r")) == NULL) {
		perror(path);
		return 1;
	}
	while (fscanf(fp, "%u", &n) == 1 && n > 0 && n <= MAXINPUT) {
		printf("%u\n", foursq(n));
	}
	fclose(fp);
	return 0;
}
