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: Accepted)

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define vec vector<ll>
#define sortv(a); sort(a.begin(), a.end());
#define rev(a); reverse(a.begin(), a.end());
#define FOR(i,a,b) for (ll i = (ll)(a); i < (b); i++)
#define ROF(i,a,b) for (ll i = (ll)(b)-1; i >= (a); i--)

ll MOD = 1000000007;
ll INF = 1LL << 60;

int solve(ll n) {
	if (n==2) return 1;
	if (n==3) return 2;
	if (n==4) return 3;
	if (n==5) return 3;
	set<ll> out;
	out.insert((ll)(n));
	out.insert((ll)(n-1));
	for(ll i=2;i*i<=n;i++) {
		if (n%i==0) {
			ll temp=n;
			while (temp%i==0) {
				temp/=i;
			}
			if ((temp-1)%i==0) out.insert(i);
		}
	}
	for(ll i=2;i*i<=(n-1);i++) {
		if ((n-1)%i==0) {
			out.insert(i);
			out.insert(n/i);
		}
	}
	// for (const auto s : out) {
	// 	cout<<s<<endl;
	// }
	return out.size();
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	
	ll n;cin>>n;
	cout<<solve(n);
}