func_code_string: #include <bits/stdc++.h>   using namespace std;   int rd();   int gcd(int a, int b) { return a == 0 ? b : gcd(b % a, a); }   int J(int x) {     int sum = 0;     for (int i = 1; i * i <= x; ++i) {       if (x % i == 0 && gcd(i, x / i) == 1) {         sum += i;         sum += x / i;       }     }     return sum;   }   const int N = 1000007;   int n, cnt, pr[N], lp[N];   void sieve() {     for (int i = 2; i < N; ++i) {       if (lp[i] == 0) {         lp[i] = i;         pr[cnt++] = i;       }       for (int j = 0; j < cnt && pr[j] <= lp[i] && pr[j] * i < N; ++j) {         lp[i * pr[j]] = pr[j];       }     }   }   long long getp(long long d) {     --d;     for (int i = 0; i < cnt && (long long)pr[i] * pr[i] <= d; ++i) {       if (d % pr[i] == 0) {         while (d % pr[i] == 0) d /= pr[i];         if (d == 1) return pr[i];         return -1;       }     }     return d;   }   vector<pair<long long, long long> > mas;   long long ans;   bool used[N];   void rec(int ptr, long long rem) {     if (rem == 1) {       ++ans;       return;     }     if (ptr == (int)(mas).size()) return;     if (rem % mas[ptr].first == 0 && !used[mas[ptr].second]) {       used[mas[ptr].second] = true;       rec(ptr + 1, rem / mas[ptr].first);       used[mas[ptr].second] = false;     }     rec(ptr + 1, rem);   }   void solve() {     sieve();     long long x;     cin >> x;     vector<long long> divs;     for (int i = 1; (long long)i * i <= x; ++i) {       if (x % i == 0) {         if (i != 1) divs.push_back(i);         if (i * i != x) divs.push_back(x / i);       }     }     sort((divs).begin(), (divs).end());     vector<long long> pp;     for (long long d : divs) {       long long p = getp(d);       if (p == -1 || p == 1) continue;       mas.push_back(make_pair(d, p));       pp.push_back(p);     }     sort((mas).begin(), (mas).end());     reverse((mas).begin(), (mas).end());     sort((pp).begin(), (pp).end());     for (int i = 0; i < ((int)(mas).size()); ++i)       mas[i].second =           lower_bound((pp).begin(), (pp).end(), mas[i].second) - pp.begin();     rec(0, x);     cout << ans << endl;   }   int rd() { return (((long long)rand() << 16) ^ rand()) % 1000000000; }   void testGen() {     FILE *f = fopen( input.txt ,  w );     fclose(f);   }   int main() {     cerr << fixed;     cerr.precision(9);     solve();     return 0;   }   