#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

const int LIM = 10;

void show_all_permutations(int init_digits_flag) {
	std::vector<int> nums, idx;

	while (init_digits_flag > 0) {
		nums.push_back(init_digits_flag % 10);
		init_digits_flag /= 10;
	}
	for (int i = 0; i < LIM; i++)
		idx.push_back(i);

	std::set<int> digits_flags;
	do {
		int flag = 0;
		for (int new_id: idx)
			flag = flag * 10 + nums[new_id];

		if (digits_flags.find(flag) == digits_flags.end()) {
			for (int new_id: idx)
				std::cout << nums[new_id] << " ";
			std::cout << "\n";
			
			digits_flags.insert(flag);
		}
	} while (std::next_permutation(idx.begin(), idx.end()));
}

int f[11][101][10];
// f[i][k][l]: đếm số cách biểu diễn k dưới dạng tổng bình phương của i số
// trong khoảng [1, 9]; i số tạo thành dãy tăng dần mà số cuối cùng là l

void init_f() {
	for (int l = 0; l <= 9; l++) {
		for (int k = 0; k <= 100; k++)
			for (int i = 0; i <= 10; i++)
				f[i][k][l] = 0;

		f[1][l*l][l] = 1;
	}
	
	for (int i = 2; i <= 10; i++) {
		for (int l1 = 1; l1 <= 9; l1++)
			for (int l2 = l1; l2 <= 9; l2++) 
				for (int k = l2*l2+l1*l1; k <= 100; k++) {
					f[i][k][l2] += f[i-1][k-l2*l2][l1];
				}
	}
}

void trace(int n, int x_cnt, int number_flags) {
	if (x_cnt == 0) {
		show_all_permutations(number_flags);
	} else {
		for (int l = 9; l >= 1; l--)
			if (f[x_cnt][n][l] > 0)
				trace(n-l*l, x_cnt-1, number_flags*10+l);
	}
}

int main() {
	init_f();

	int n;
	std::cin >> n;

	int ans = 0;
	for (int l = 1; l <= 10; l++)
		ans += f[10][n][l];

	if (ans == 0)
		std::cout << "-1\n";
	else {
		std::cout << ans << "\n";
		// trace(n, 10, 0);
	}
}