#include <bits/stdc++.h>
using namespace std;
const long long lim = 1000000000001ll;
const int Maxn = 100000;
int nwmx[Maxn];
long long A;
map<long long, long long> zero;
map<pair<long long, long long>, long long> vals;
long long newMax(long long A) {
  for (long long i = 2; i * i <= A; i++)
    if (A % i == 0ll) {
      while (A % i == 0ll) A /= i;
      return A == 1 ? i : -1;
    }
  return A;
}
long long newMax(long long A, long long mx) {
  if (A < Maxn) return nwmx[A] < mx ? nwmx[A] : -1;
  for (long long i = 2; i * i <= A && i < mx; i++)
    if (A % i == 0ll) {
      while (A % i == 0ll) A /= i;
      return A == 1 ? i : -1;
    }
  return A < mx ? A : -1;
}
long long Get(long long A, long long mx);
long long Find(long long A, long long dv, long long mx) {
  if (dv >= 3) {
    mx = newMax(dv - 1, mx);
    if (mx != -1) return Get(A / dv, mx);
  }
  return 0ll;
}
long long Get(long long A, long long mx) {
  if (A == 1ll) return 1;
  map<long long, long long>::iterator it = zero.find(A);
  if (it != zero.end() && it->second >= mx) return 0;
  map<pair<long long, long long>, long long>::iterator it2 =
      vals.find(pair<long long, long long>(A, mx));
  if (it2 != vals.end()) return it2->second;
  long long res = 0ll;
  for (long long i = 1; i * i <= A; i++)
    if (A % i == 0ll) {
      res += Find(A, i, mx);
      if (i * i != A) res += Find(A, A / i, mx);
    }
  if (res == 0ll)
    zero[A] = mx;
  else
    vals[pair<long long, long long>(A, mx)] = res;
  return res;
}
int main() {
  for (int i = 2; i < Maxn; i++) nwmx[i] = newMax(i);
  scanf("%I64d", &A);
  printf("%I64d\n", Get(A, lim));
  return 0;
}
