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 <bits/stdc++.h>
using namespace std;

#define fastIO      ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define asc(s)      sort(s.begin(), s.end())
#define des(s)      sort(s.rbegin(), s.rend())
#define pb(x)       push_back(x)
#define mp(x, y)    make_pair(x, y)
#define all(v)      v.begin(), v.end()
#define rev(v)      reverse(v.begin(), v.end())
#define lower(s)    transform(s.begin(), s.end(), s.begin(), ::tolower);
#define upper(s)    transform(s.begin(), s.end(), s.begin(), ::toupper);
#define MOD         1000000007
#define PI          3.14159265358979

typedef long long ll;

template <typename TH>
void _dbg(const char *sdbg, TH h) { cerr << sdbg << "=" << h << "\n"; }
template <typename TH, typename... TA>
void _dbg(const char *sdbg, TH h, TA... t)
{
    while (*sdbg != ',')
    {
        cerr << *sdbg++;
    }
    cerr << "=" << h << ",";
    _dbg(sdbg + 1, t...);
}

#ifndef ONLINE_JUDGE
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug
#endif

template <class T>
T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }

template <class T>
T lcm(T a, T b) { return a * b / gcd(a, b); }

vector<string> split(string s)
{
    istringstream buf(s);
    istream_iterator<string> beg(buf), end;
    vector<string> list(beg, end);
    return list;
}

bool isvowel(char c)
{
    string s = "aeiouAEIOU";
    if (find(s.begin(), s.end(), c) != s.end())     return true;
    return false;
}

vector <ll> sieve(ll n)
{
    vector<bool> prime(n + 1, true);
    prime[0] = prime[1] = 0;

    for (int i = 2; i * i <= n; i++)
    {
        if (prime[i])
            for (int j = i * i; j <= n; j += i)
            {
                prime[j] = 0;
            }
    }

    vector <ll> p;

    for(int i=2; i<=prime.size();i++)
        if(prime[i])
            p.pb(i);
    
    return p;        
}

bool isprime(int n)
{
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
            return false;
    }

    return true && (n!=1);
}

int ncr(ll n, ll r) 
{ 
    ll C[r+1]; 
    memset(C, 0, sizeof(C)); 

    C[0] = 1; 

    for (ll i = 1; i <= n; i++) 
    { 
        for (ll j = min(i, r); j > 0; j--) 
            // nCj = (n-1)Cj + (n-1)C(j-1); 
            C[j] = (C[j] + C[j-1])%MOD; 
    } 

    return C[r]; 
}

bool special(string s)
{
    for(int i=0;i<s.size();i++)
    {
        if(s[i] == ' ')
            continue;
        
        if(s[i] == '#')
            return true;
        
        else
            return false;
    }
    return false;
}

vector <ll> ans;

bool cmp(string &a, string &b)
{
    return (a.size() < b.size() )|| (a.size() == b.size() && a < b);
}

void solve()
{
    ll n;
    cin >> n;

    set <ll> ans;
    ans.insert(n);
    ans.insert(n-1);

    for(ll i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            ll m = n;

            while(m%i == 0)
            {
                m/=i;
            }

            if(m%i==1)
                ans.insert(i);

            m = n;

            ll j = n/i;
            
            if(i != n/i)
            {
                while(m%j == 0)
                {
                    m/=j;
                }

                if(m%j==1)
                    ans.insert(n/i);
            }
        }

        if(n%i==1) 
        {
            ans.insert(i);
        }

        if( n % (n/i) == 1)
            ans.insert(n/i);
    }

    cout << ans.size();
}

int main()
{
    fastIO
   


    int t = 1;
    // cin >> t;

    for(int i=1;i<=t;i++)
    {
        solve();
    }

    return 0;
}