#include <bits/stdc++.h>
using namespace std;
struct decomposition {
  long long num1, num2, num3;
};
long long lpow(long long p, int n) {
  long long r = 1;
  while (n--) r *= p;
  return r;
}
void findDecompositions(int d, vector<decomposition>& res, long long p) {
  res.clear();
  for (int d1 = 0; d1 <= d; ++d1) {
    for (int d2 = 0; d1 + d2 <= d; ++d2) {
      decomposition sd;
      sd.num1 = lpow(p, d1);
      sd.num2 = lpow(p, d2);
      sd.num3 = lpow(p, d - d1 - d2);
      res.push_back(sd);
    }
  }
}
vector<vector<decomposition> > sd;
bool ok(const vector<size_t>& idx) {
  long long x = 1, y = 1, z = 1;
  for (size_t i = 0; i < idx.size(); ++i) {
    const auto& sdi = sd[i][idx[i]];
    x *= sdi.num1;
    y *= sdi.num2;
    z *= sdi.num3;
  }
  return ((x + y + z) % 2) == 0 && x + y > z && x + z > y && y + z > x;
}
bool next(vector<size_t>& idx) {
  int n = idx.size();
  int i = 0;
  while (i < n && idx[i] == sd[i].size() - 1) {
    idx[i] = 0;
    ++i;
  }
  if (i == n) return false;
  idx[i]++;
  return true;
}
int main() {
  long long n;
  cin >> n;
  if (n % 3 != 0) {
    cout << 0 << endl;
    return 0;
  }
  n /= 3;
  for (long long x = 2; x * x <= n; ++x)
    if (n % x == 0) {
      int d = 0;
      do {
        n /= x;
        d++;
      } while (n % x == 0);
      sd.push_back(vector<decomposition>());
      findDecompositions(d, sd.back(), x);
    }
  if (n > 1) {
    sd.push_back(vector<decomposition>());
    findDecompositions(1, sd.back(), n);
  }
  vector<size_t> idx(sd.size(), 0);
  int res = 0;
  do {
    if (ok(idx)) ++res;
  } while (next(idx));
  cout << res << endl;
  return 0;
}
