#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);
}
}