#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  char ch = getchar();
  long long s = 0, w = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    s = s * 10 + ch - '0';
    ch = getchar();
  }
  return s * w;
}
inline long long lowbit(long long x) { return x & (-x); }
long long A;
long long prime[2000010], tot, vis[2000010];
map<pair<long long, long long>, long long> ma;
unordered_map<long long, long long> ch;
inline void prepare(long long Maxn) {
  vis[1] = 1;
  for (register long long i = 2; i <= Maxn; i++) {
    if (!vis[i]) {
      prime[++tot] = i;
    }
    for (register long long j = 1; j <= tot && prime[j] * i <= Maxn; j++) {
      vis[i * prime[j]] = 1;
      if (i % prime[j] == 0) break;
    }
  }
}
inline long long check(long long x) {
  if (x <= 2000010 - 10) return (!vis[x]);
  if (ch.count(x)) return 1;
  for (register long long i = 1; i <= tot && prime[i] * prime[i] <= x; i++)
    if (x % prime[i] == 0) return 0;
  return ch[x] = 1;
}
long long F(long long x, long long now) {
  if (x == 1) return 1;
  if (prime[now] + 1 > x) return 0;
  if (x == prime[now] + 1) {
    return 1;
  }
  if (prime[now] * prime[now] + 1 > x) {
    return check(x - 1);
  }
  if (ma.count(make_pair(x, now))) return ma[make_pair(x, now)];
  long long s = F(x, now + 1), v = prime[now];
  while (v < x) {
    if (x % (v + 1) == 0) s += F(x / (v + 1), now + 1);
    v *= prime[now];
  }
  return ma[make_pair(x, now)] = s;
}
int main() {
  prepare(2000010 - 10);
  A = read();
  cout << F(A, 1) << '\n';
  return 0;
}
