#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int maxn = 1000000 + 10;
vector<long long> p;
int cnt, vis[maxn];
long long n;
inline void init() {
  for (int i = 2; i < maxn; ++i) {
    if (!vis[i]) p.push_back(i), ++cnt;
    for (int j = 0; j < cnt && p[j] * i < maxn; ++j) {
      vis[p[j] * i] = 1;
      if (i % p[j] == 0) break;
    }
  }
}
map<long long, int> psid;
vector<vector<long long> > has;
int tot;
long long ans = 0;
struct node {
  long long val, key, nxt;
};
struct HashMap {
  static const long long mod = 1e6 + 7;
  int head[mod], tot;
  vector<int> hist;
  vector<node> has;
  int find(long long x) {
    long long v = x % mod;
    for (int i = head[v]; i; i = has[i].nxt) {
      if (x == has[i].key) return 1;
    }
    return 0;
  }
  long long operator[](const long long& x) { return value(x); }
  long long value(long long x) {
    long long v = x % mod;
    for (int i = head[v]; i; i = has[i].nxt) {
      if (x == has[i].key) return has[i].val;
    }
    return 0;
  }
  void add(long long x, long long va = 1) {
    long long v = x % mod;
    for (int i = head[v]; i; i = has[i].nxt) {
      if (x == has[i].key) {
        has[i].val += va;
        return;
      }
    }
    has.push_back(node());
    has[tot].nxt = head[v];
    has[tot].key = x;
    has[tot].val = va;
    head[v] = tot++;
    hist.push_back(v);
  }
  void clear() {
    tot = 1;
    has.clear();
    has.push_back(node());
    for (; !hist.empty(); hist.pop_back()) {
      head[hist.back()] = 0;
    }
  }
};
HashMap dp[2];
inline void solve() {
  vector<long long> fac;
  for (long long i = 1; i * i <= n; ++i) {
    if (n % i == 0) {
      if (i != 1) fac.push_back(i);
      if (n / i != i) fac.push_back(n / i);
    }
  }
  sort((fac).begin(), (fac).end());
  fac.erase(unique((fac).begin(), (fac).end()), fac.end());
  for (auto e : fac) {
    long long x = e - 1;
    if (x == 1) continue;
    long long ok = 0;
    for (int i = 0; p[i] * p[i] <= x; ++i) {
      if (x % p[i] == 0) {
        ok = p[i];
        while (x % p[i] == 0) x /= p[i];
        break;
      }
    }
    if (!ok) {
      if (!psid.count(x)) {
        psid[x] = tot++;
        has.push_back(vector<long long>());
      }
      has[psid[x]].push_back(e);
    } else {
      if (x == 1) {
        if (!psid.count(ok)) {
          psid[ok] = tot++;
          has.push_back(vector<long long>());
        }
        has[psid[ok]].push_back(e);
      }
    }
  }
  int t = 0;
  for (auto i = (0); i < (2); ++i) dp[i].clear();
  dp[t].add(n, 1);
  for (auto i = (0); i < (tot); ++i) {
    dp[t ^ 1].clear();
    for (auto e : dp[t].has) {
      for (auto x : has[i]) {
        if (e.key % x == 0) {
          dp[t ^ 1].add(e.key / x, e.val);
        }
      }
    }
    for (auto e : dp[t].has) {
      dp[t ^ 1].add(e.key, e.val);
    }
    t ^= 1;
  }
  printf("%lld\n", dp[t].value(1));
}
int main(void) {
  init();
  scanf("%lld", &(n));
  solve();
  return 0;
}
