#include using namespace std; typedef long long ll; #define REP(i,n) for(int i=0,_n=(int)(n);i<_n;++i) #define ALL(v) (v).begin(),(v).end() #define CLR(t,v) memset(t,(v),sizeof(t)) templateostream& operator<<(ostream& os,const pair&a){return os<<"("<void pv(T a,T b){for(T i=a;i!=b;++i)cout<<(*i)<<" ";cout<void chmin(T&a,const T&b){if(a>b)a=b;} templatevoid chmax(T&a,const T&b){if(a divisors(ll N) { vector res; for (ll d = 1; d * d <= N; d++) { if (N % d == 0) { res.push_back(d); if (d * d != N) res.push_back(N/d); } } sort(ALL(res)); return res; } bool isSquare(ll x) { ll r = (ll)sqrt(x + 0.5); return r * r == x; } int main2() { ll N = nextLong(); vector divs; // N^2 の約数 { vector t = divisors(N); REP(i, t.size()) { for (int j = i; j < (int)t.size(); j++) { divs.push_back(t[i] * t[j]); } } sort(ALL(divs)); divs.erase(unique(ALL(divs)), divs.end()); } // pv(ALL(divs)); set> vis; REP(i, divs.size()) { for (int j = i; j < (int)divs.size(); j++) { ll x = divs[i]; ll y = divs[j]; ll a = 1; ll b = (x + y); if (N*N < (x*y)) continue; ll c = -N*N / (x * y); ll D = (b*b -4*a*c); if (D < 0 || !isSquare(D)) continue; ll rD = (ll)sqrt(D + 0.5); if ((-b + rD) % 2 == 0) { ll z = (-b + rD) / 2; if (z >= 0) { vector v({x+y, y+z, z+x}); sort(ALL(v)); if (v[0] + v[1] > v[2]) vis.insert(v); } } if ((-b - rD) % 2 == 0) { ll z = (-b - rD) / 2; if (z >= 0) { vector v({x+y, y+z, z+x}); sort(ALL(v)); if (v[0] + v[1] > v[2]) vis.insert(v); } } } } int ng = 0; for (auto v : vis) { ll a = v[0]; ll b = v[1]; ll c = v[2]; ll S2 = (a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c); // cout << a << " " << b << " " << c << " -> " << S2/16 << endl; if (S2/16 != N*N) ng++; } ll ans = vis.size() - ng; cout << ans << endl; return 0; } int main() { #ifdef LOCAL for (;!cin.eof();cin>>ws) #endif main2(); return 0; }