func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   ostream &operator<<(ostream &out, const vector<T> &v) {     out <<  { ;     for (const T &a : v) out << a <<  ,  ;     out <<  } ;     return out;   }   template <typename S, typename T>   ostream &operator<<(ostream &out, const pair<S, T> &p) {     out <<  (  << p.first <<  ,   << p.second <<  ) ;     return out;   }   const int dx[] = {0, 0, -1, 1};   const int dy[] = {-1, 1, 0, 0};   long long fpw(long long a, long long b, long long p) {     long long r = 1;     while (b) {       if (b & 1) r = r * a % p;       a = a * a % p;       b /= 2;     }     return (long long)r;   }   bool check(long long p, long long d, long long a) {     a %= p;     if (!a) return 1;     if (fpw(a, p - 1, p) != 1) return 0;     if ((a = fpw(a, d, p)) == 1) return 1;     while (a != 1) {       if (a == p - 1) return 1;       a = a * a % p;     }     return 0;   }   vector<long long> primes;   bool prime(long long p) {     if (p < 4) return p > 1;     if (!(p & 1)) return 0;     if (p <= 2000000000) {       long long d = p - 1;       while (!(d & 1)) d /= 2;       return check(p, d, 2) && check(p, d, 325) && check(p, d, 9375) &&              check(p, d, 28178) && check(p, d, 450775) && check(p, d, 9780504) &&              check(p, d, 1795265022);     } else {       for (long long first : primes) {         if (first * first > p) return 1;         if (p % first == 0) return 0;       }       return 1;     }   }   long long n;   vector<long long> D;   vector<long long> R, Q;   void apply(long long d) {     int i = ((int)(D).size()) - 1;     int j = ((int)(D).size()) - 1;     while (n / d != D[i]) --i;     while (i >= 0) {       while (D[j] > D[i] * d) --j;       if (D[j] == D[i] * d) Q[j] += R[i];       --i;     }   }   int main() {     ios_base::sync_with_stdio(0);     for (int i = (2); i < (1000010); ++i)       if (prime(i)) primes.push_back(i);     cin >> n;     for (long long d = 1; d * d <= n; ++d)       if (n % d == 0) {         D.push_back(d);         if (d * d != n) D.push_back(n / d);       }     sort(D.begin(), D.end());     R.resize(((int)(D).size()));     Q.resize(((int)(D).size()));     R[0] = 1;     for (long long p : primes) {       long long pk = p;       bool once = 0;       while (pk + 1 <= n) {         if (n % (pk + 1) == 0) {           once = 1;           apply(pk + 1);         }         pk *= p;       }       if (once)         for (int i = (0); i < (((int)(D).size())); ++i) {           R[i] += Q[i];           Q[i] = 0;         }     }     for (long long d : D)       if (d - 1 > primes.back() && prime(d - 1)) {         for (int i = (0); i < (((int)(D).size())); ++i) Q[i] = 0;         apply(d);         for (int i = (0); i < (((int)(D).size())); ++i) R[i] += Q[i];       }     cout << R.back() << endl;     return 0;   }   