Problem:
Score : 600 points

Problem Statement

Given is a positive integer N.

We will choose an integer K between 2 and N (inclusive), then we will repeat the operation below until N becomes less than K.

Operation: if K divides N, replace N with N/K; otherwise, replace N with N-K.

In how many choices of K will N become 1 in the end?

Constraints

2 \leq N \leq 10^{12}

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

Print the number of choices of K in which N becomes 1 in the end.

Sample Input 1

6

Sample Output 1

3

There are three choices of K in which N becomes 1 in the end: 2, 5, and 6.

In each of these choices, N will change as follows:

When K=2: 6 \to 3 \to 1

When K=5: 6 \to 1

When K=6: 6 \to 1

Sample Input 2

3141

Sample Output 2

13

Sample Input 3

314159265358

Sample Output 3

9

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int p_MAX = 1100000;
vector<long long> prime;
// エラトステネスの篩(vec)
int calc_prime()
{
  bool notPrime[p_MAX];
  int n = sqrt(p_MAX)+1;
  notPrime[0]=1;
  notPrime[1]=1;
  for(int i=0;i<=n;i++){
    if(notPrime[i])
      continue;
    int m = p_MAX/i;
    for(int j=2;j<=m;j++)
      notPrime[j*i]=1;
  }
  prime.clear();
  for(int i=0;i<p_MAX;i++)
    if(!notPrime[i])
      prime.push_back(i);
  return 0;
}
int main()
{
  long long n,k,t,ta,tb,m,res=0,i,j;
  vector<long long> a;
  cin >> n;
  if(n==2){
    cout << "1" << endl;
    return 0;
  }
  calc_prime();
  double sq=sqrt(n)+1;
  m=n;
  for(i=0;i<prime.size();i++){
    if(prime[i]>sq||prime[i]>m) break;
    t=1;
    while(m%prime[i]==0){
      m/=prime[i];
      t*=prime[i];
    }
    if(t>1)
      a.push_back(t);
  }
  if(m>prime[i])
    a.push_back(m);
  m=(long long)1<<a.size();
  for(i=1;i<m;i++){
    k=i; ta=1; tb=1;
    for(j=0;j<a.size();j++){
      t=k%2;
      if(t>0) ta*=a[j];
      else tb*=a[j];
      k/=2;
    }
    if(ta%tb==1) res++;
  }
  k=1;
  n--;
  m=n;
  for(i=0;i<prime.size();i++){
    if(prime[i]>sq||prime[i]>m) break;
    t=1;
    while(m%prime[i]==0){
      m/=prime[i];
      t++;
    }
    k*=t;
  }
  if(m>prime[i])
    k*=2;
  res+=k;
  cout << res << endl;
  return 0;
}