#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;
}
