#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const long long MAXVAL = 1e12;
const int MAXN = 1e6;
const int MAXM = 4096;
const int MAXP = 78498;
const int MAXPP = 80070;
bool mark[MAXN + 1];
int pf[MAXP + 1];
long long pf_power[MAXPP + 1];
map<long long, int> rt;
map<long long, int> rem;
vector<long long> g[MAXM];
long long used[MAXM];
long long idx[MAXM];
map<long long, int> dp[2];
long long n;
int m, tmp;
bool now, pre;
void fast_io() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
}
void prepare() {
  memset(mark, 1, sizeof(mark));
  mark[0] = mark[1] = 0;
  int cnt = 0;
  for (int i = 2; i <= MAXN; i++) {
    if (mark[i]) {
      pf[cnt++] = i;
      for (int j = (i << 1); j <= MAXN; j += i) mark[j] = 0;
    }
  }
  int len = 0;
  for (int i = 0; i < cnt; i++) {
    long long curr = pf[i];
    rt[curr] = pf[i];
    for (int j = 0; true; j++) {
      curr *= pf[i];
      if (curr >= MAXVAL) break;
      pf_power[len++] = curr;
      rt[curr] = pf[i];
    }
  }
  sort(pf_power, pf_power + len);
}
bool ok(long long x) {
  if (x <= 1) return 0;
  if (rt.count(x)) return 1;
  for (int i = 0; (1LL * pf[i] * pf[i]) <= x and i < MAXP; i++) {
    if (x % pf[i] == 0) return 0;
  }
  rt[x] = x;
  return 1;
}
int main() {
  fast_io();
  prepare();
  cin >> n;
  m = 0;
  for (long long i = 1; i * i <= n; i++) {
    if (n % i) continue;
    long long a = (n / i), b = i;
    int root;
    if (ok(a - 1)) {
      root = rt[a - 1];
      used[m] = a;
      idx[m++] = root;
    }
    if (a ^ b and ok(b - 1)) {
      root = rt[b - 1];
      used[m] = b;
      idx[m++] = root;
    }
  }
  tmp = m;
  sort(idx, idx + m);
  m = unique(idx, idx + m) - idx;
  for (int i = 0; i < tmp; i++) {
    int pos = lower_bound(idx, idx + m, rt[used[i] - 1]) - idx + 1;
    g[pos].push_back(used[i]);
  }
  dp[0][n] = 1;
  for (int i = 1; i <= m; i++) {
    now = (i & 1);
    pre = (now ^ 1);
    dp[now].clear();
    for (auto x : dp[pre]) {
      dp[now][x.first] = dp[pre][x.first];
    }
    for (auto v : g[i]) {
      for (auto x : dp[pre]) {
        if (x.first % v) continue;
        dp[now][x.first / v] += dp[pre][x.first];
      }
    }
  }
  cout << dp[now][1] << '\n';
  return 0;
}
