#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const long double eps = 1e-7;
const int inf = 1000000010;
const long long INF = 10000000000000010LL;
const int MAXN = 100010, LOG = 20;
long long A, n, x, y, ans;
vector<long long> D, prime;
long long dp[2000][6720];
long long is(long long x, long long y) {
  long long tmp = 1;
  while (tmp < y) tmp *= x;
  return tmp == y;
}
long long get(long long x) {
  if (x <= 2) return -1;
  x--;
  for (long long i = 2; i * i <= x; i++)
    if (x % i == 0) {
      long long tmp = is(i, x);
      if (!tmp) return -1;
      return i;
    }
  return x;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> A;
  for (long long i = 1; i * i <= A; i++)
    if (A % i == 0) {
      D.push_back(i);
      if (i * i != A) D.push_back(A / i);
    }
  for (long long x : D) {
    long long tmp = get(x);
    if (tmp != -1) prime.push_back(tmp);
  }
  sort(D.begin(), D.end());
  sort(prime.begin(), prime.end());
  prime.resize(unique(prime.begin(), prime.end()) - prime.begin());
  dp[0][0] = 1;
  for (int i = 0; i < prime.size(); i++) {
    long long p = prime[i];
    for (int j = 0; j < D.size(); j++) {
      long long tmp = p;
      dp[i + 1][j] += dp[i][j];
      for (; (tmp + 1) * D[j] <= A && (tmp + 1) * D[j] > 0; tmp *= p)
        if (A % ((tmp + 1) * D[j]) == 0)
          dp[i + 1][lower_bound(D.begin(), D.end(), (tmp + 1) * D[j]) -
                    D.begin()] += dp[i][j];
    }
  }
  cout << dp[prime.size()][D.size() - 1] << '\n';
  return 0;
}
