#include <bits/stdc++.h>
using namespace std;
bool isprm(long long x) {
  for (long long i = 2; i * i <= x; ++i) {
    if (x % i == 0) return false;
  }
  return true;
}
long long A;
bool prm[2000010];
vector<long long> vec;
vector<long long> divs[100010];
vector<int> ids;
vector<long long> dv;
int main() {
  cin >> A;
  for (long long i = 1; i * i <= A; ++i) {
    if (A % i == 0) {
      dv.push_back(i);
      if (i * i != A) dv.push_back(A / i);
    }
  }
  sort((dv).begin(), (dv).end());
  int now = 0;
  for (int i = 2; i <= 1000000; ++i) {
    if (!prm[i]) {
      int id = vec.size();
      vec.push_back(i);
      long long cur = i;
      bool flg = 0;
      while (1 + cur <= A) {
        if (A % (1 + cur) == 0) {
          divs[now].push_back(cur + 1);
          flg = 1;
        }
        cur *= i;
      }
      if (flg) {
        ids.push_back(id);
        ++now;
      }
      for (int j = i * 2; j <= 1000000; j += i) {
        prm[j] = 1;
      }
    }
  }
  vector<vector<long long>> dp(now + 1, vector<long long>((int)dv.size()));
  dp[0][0] = 1;
  for (int i = 0; i < (now); i++) {
    for (int j = 0; j < (dv.size()); j++) {
      dp[i + 1][j] = dp[i][j];
    }
    for (int j = 0; j < (dv.size()); j++) {
      for (int k = 0; k < (divs[i].size()); k++) {
        if ((A / dv[j]) % divs[i][k] == 0) {
          int nid = lower_bound((dv).begin(), (dv).end(), dv[j] * divs[i][k]) -
                    dv.begin();
          dp[i + 1][nid] += dp[i][j];
        }
      }
    }
  }
  long long ret = dp[now][(int)dv.size() - 1];
  for (int i = 0; i < (dv.size()); i++) {
    long long rem = A / dv[i];
    if (rem > 1e6) {
      if (isprm(rem - 1)) ret += dp[now][i];
    }
  }
  cout << ret << endl;
  return 0;
}
