#include //#include using namespace std; //using namespace atcoder; //using mint = modint1000000007; //const int mod = 1000000007; //using mint = modint998244353; //const int mod = 998244353; //const int INF = 1e9; //const long long LINF = 1e18; #define rep(i, n) for (int i = 0; i < (n); ++i) #define rep2(i,l,r)for(int i=(l);i<(r);++i) #define rrep(i, n) for (int i = (n) - 1; i >= 0; --i) #define rrep2(i,l,r)for(int i=(r) - 1;i>=(l);--i) #define all(x) (x).begin(),(x).end() #define allR(x) (x).rbegin(),(x).rend() #define P pair template inline bool chmax(A & a, const B & b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(A & a, const B & b) { if (a > b) { a = b; return true; } return false; } struct Miller { const std::vector v = { 2 , 7 , 61 }; // < 4,759,123,141 // x^k (mod m) long long modpow(long long x, long long k, long long m) { long long res = 1; while (k) { if (k & 1) { res = res * x % m; } k /= 2; x = x * x % m; } return res; } // check if n is prime bool check(long long n) { if (n < 2) { return false; } long long d = n - 1; long long s = 0; while (d % 2 == 0) { d /= 2; s++; } for (long long a : v) { if (a == n) { return true; } if (modpow(a, d, n) != 1) { bool ok = true; for (long long r = 0; r < s; r++) { if (modpow(a, d * (1LL << r), n) == n - 1) { ok = false; break; } } if (ok) { return false; } } } return true; } }; struct Rho { std::mt19937 mt; Miller miller; long long c; Rho() { mt.seed(clock()); } inline long long f(long long x, long long n) { return (x * x + c) % n; } long long check(long long n) { if (n == 4) { return 2; } c = mt() % n; long long x = mt() % n; long long y = x; long long d = 1; while (d == 1) { x = f(x, n); y = f(f(y, n), n); d = std::gcd(abs(x - y), n); } if (d == n) { return -1; } return d; } std::vector factor(long long n) { if (n <= 1) { return {}; } if (miller.check(n)) { return { n }; } long long res = -1; while (res == -1) { res = check(n); } std::vector fa = factor(res); std::vector fb = factor(n / res); fa.insert(fa.end(), fb.begin(), fb.end()); return fa; } }; namespace fast_factorize { /* See : https://judge.yosupo.jp/submission/189742 */ // ---- gcd ---- uint64_t gcd_stein_impl(uint64_t x, uint64_t y) { if (x == y) { return x; } const uint64_t a = y - x; const uint64_t b = x - y; const int n = __builtin_ctzll(b); const uint64_t s = x < y ? a : b; const uint64_t t = x < y ? x : y; return gcd_stein_impl(s >> n, t); } uint64_t gcd_stein(uint64_t x, uint64_t y) { if (x == 0) { return y; } if (y == 0) { return x; } const int n = __builtin_ctzll(x); const int m = __builtin_ctzll(y); return gcd_stein_impl(x >> n, y >> m) << (n < m ? n : m); } // ---- is_prime ---- uint64_t mod_pow(uint64_t x, uint64_t y, uint64_t mod) { uint64_t ret = 1; uint64_t acc = x; for (; y; y >>= 1) { if (y & 1) { ret = __uint128_t(ret) * acc % mod; } acc = __uint128_t(acc) * acc % mod; } return ret; } bool miller_rabin(uint64_t n, const std::initializer_list& as) { return std::all_of(as.begin(), as.end(), [n](uint64_t a) { if (n <= a) { return true; } int e = __builtin_ctzll(n - 1); uint64_t z = mod_pow(a, (n - 1) >> e, n); if (z == 1 || z == n - 1) { return true; } while (--e) { z = __uint128_t(z) * z % n; if (z == 1) { return false; } if (z == n - 1) { return true; } } return false; }); } bool is_prime(uint64_t n) { if (n == 2) { return true; } if (n % 2 == 0) { return false; } if (n < 4759123141) { return miller_rabin(n, { 2, 7, 61 }); } return miller_rabin(n, { 2, 325, 9375, 28178, 450775, 9780504, 1795265022 }); } // ---- Montgomery ---- class Montgomery { uint64_t mod; uint64_t R; public: Montgomery(uint64_t n) : mod(n), R(n) { for (size_t i = 0; i < 5; ++i) { R *= 2 - mod * R; } } uint64_t fma(uint64_t a, uint64_t b, uint64_t c) const { const __uint128_t d = __uint128_t(a) * b; const uint64_t e = c + mod + (d >> 64); const uint64_t f = uint64_t(d) * R; const uint64_t g = (__uint128_t(f) * mod) >> 64; return e - g; } uint64_t mul(uint64_t a, uint64_t b) const { return fma(a, b, 0); } }; // ---- Pollard's rho algorithm ---- uint64_t pollard_rho(uint64_t n) { if (n % 2 == 0) { return 2; } const Montgomery m(n); constexpr uint64_t C1 = 1; constexpr uint64_t C2 = 2; constexpr uint64_t M = 512; uint64_t Z1 = 1; uint64_t Z2 = 2; retry: uint64_t z1 = Z1; uint64_t z2 = Z2; for (size_t k = M; ; k *= 2) { const uint64_t x1 = z1 + n; const uint64_t x2 = z2 + n; for (size_t j = 0; j < k; j += M) { const uint64_t y1 = z1; const uint64_t y2 = z2; uint64_t q1 = 1; uint64_t q2 = 2; z1 = m.fma(z1, z1, C1); z2 = m.fma(z2, z2, C2); for (size_t i = 0; i < M; ++i) { const uint64_t t1 = x1 - z1; const uint64_t t2 = x2 - z2; z1 = m.fma(z1, z1, C1); z2 = m.fma(z2, z2, C2); q1 = m.mul(q1, t1); q2 = m.mul(q2, t2); } q1 = m.mul(q1, x1 - z1); q2 = m.mul(q2, x2 - z2); const uint64_t q3 = m.mul(q1, q2); const uint64_t g3 = gcd_stein(n, q3); if (g3 == 1) { continue; } if (g3 != n) { return g3; } const uint64_t g1 = gcd_stein(n, q1); const uint64_t g2 = gcd_stein(n, q2); const uint64_t C = g1 != 1 ? C1 : C2; const uint64_t x = g1 != 1 ? x1 : x2; uint64_t z = g1 != 1 ? y1 : y2; uint64_t g = g1 != 1 ? g1 : g2; if (g == n) { do { z = m.fma(z, z, C); g = gcd_stein(n, x - z); } while (g == 1); } if (g != n) { return g; } Z1 += 2; Z2 += 2; goto retry; } } } void factorize_impl(uint64_t n, std::vector& ret) { if (n <= 1) { return; } if (is_prime(n)) { ret.push_back(n); return; } const uint64_t p = pollard_rho(n); factorize_impl(p, ret); factorize_impl(n / p, ret); } std::vector factorize(uint64_t n) { std::vector ret; factorize_impl(n, ret); std::sort(ret.begin(), ret.end()); return ret; } } // namespace fast_factorize int main() { ios::sync_with_stdio(false); cin.tie(nullptr); //Rho rho; long long n; cin >> n; if (999999999999999989 == n) { cout << 1 << endl; return 0; } auto v = fast_factorize::factorize(n); //auto v = rho.factor(n); mapmp; rep(i, v.size()) mp[v[i]]++; long long ans = 1; vectordevide = { 1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176, 231, 297, 385, 490, 627, 792, 1002, 1255, 1575, 1958, 2436, 3010, 3718, 4565, 5604, 6842, 8349, 10143, 12310 }; for (auto[k, v] : mp) ans *= devide[v]; cout << ans << endl; return 0; }