#include #include #include #include using namespace std; using u64 = uint64_t; using Modint = atcoder::modint998244353; u64 binary_gcd(u64 x, u64 y) { if (!x or !y) return x + y; int n = __builtin_ctzll(x), m = __builtin_ctzll(y); x >>= n; y >>= m; while (x != y) { if (x > y) { x = (x - y) >> __builtin_ctzll(x - y); } else { y = (y - x) >> __builtin_ctzll(y - x); } } return x << (n > m ? m : n); } int main() { u64 N; cin >> N; auto divisor = [&]{ vector divisor, divisor2; for(u64 d = 1; d * d <= N; d++) if(N % d == 0) { divisor.push_back(d); divisor2.push_back(N / d); } if(divisor.back() == divisor2.back()) divisor2.pop_back(); divisor.insert(divisor.end(), divisor2.rbegin(), divisor2.rend()); return divisor; }(); auto press = [&](u64 x) { return lower_bound(divisor.begin(), divisor.end(), x) - divisor.begin(); }; vector dp(divisor.size()); dp[0] = 1; for(int i = 0; i < divisor.size(); i++) { const u64 A = divisor[i]; for(u64 B : divisor) { const u64 GCD = binary_gcd(A, B); if(GCD == B) continue; const u64 LCM = A / GCD * B; dp[press(LCM)] += dp[i]; } } cout << dp.back().val() << endl; }