#include <bits/stdc++.h>
using namespace std;
long long int n;
set<long long int> r;
vector<long long int> d;
unordered_map<long long int, long long int> dindex;
vector<long long int> primes;
vector<vector<long long int> > s;
long long int Check(long long int k) {
  if (k == 0) return -1;
  if (k == 1) return -1;
  for (long long int i = 2; i * i <= k; i++) {
    if (k % i == 0) {
      while (k % i == 0) {
        k /= i;
      }
      if (k == 1) return i;
      return -1;
    }
  }
  return k;
}
int main() {
  cin >> n;
  if (n == 1) {
    cout << 1 << endl;
    return 0;
  }
  for (long long int i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      d.push_back(i);
      if ((n / i) > i) d.push_back(n / i);
      long long int q = Check(i - 1);
      if (q > 0) r.insert(q);
      q = Check(n / i - 1);
      if (q > 0) r.insert(q);
    }
  }
  if (r.size() == 0) {
    cout << 0 << endl;
    return 0;
  }
  sort(d.begin(), d.end());
  for (long long int i = 0; i < d.size(); i++) {
    dindex.insert(make_pair(d[i], i));
  }
  for (set<long long int>::iterator it = r.begin(); it != r.end(); it++) {
    primes.push_back(*it);
  }
  s.resize(d.size());
  for (int i = 0; i < s.size(); i++) s[i].assign(primes.size(), 0);
  for (int i = 0; i < primes.size(); i++) {
    s[0][i] = 1;
  }
  for (int i = 0; i < d.size(); i++) {
    for (int j = 0; j < primes.size(); j++) {
      if (j != 0) {
        s[i][j] = s[i][j - 1];
      }
      for (long long int z = primes[j]; z <= d[i]; z *= primes[j]) {
        if (d[i] % (z + 1) == 0) {
          long long int q = d[i] / (z + 1);
          if (j != 0) {
            s[i][j] += s[dindex[q]][j - 1];
          } else {
            if (q == 1) {
              s[i][j] = 1;
            }
          }
        }
      }
    }
  }
  cout << s[d.size() - 1][primes.size() - 1] << endl;
  return 0;
}
