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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;

class Program
{
	//Main
	static void Main(string[] args)
	{
		//読み込む
		long N = long.Parse(Console.ReadLine());

		//Nの約数のうち、Kで割った商をKで割った余りが1のものをカウント
		/*
		即ち、N = pKとしたとき、
		p = qK + rと表せるが、（0<=q）
		この余りrが1となれば良い
		（∵p = qK + 1となれば、Kを引き続けることで答えが1となる）
		*/
		long divCounterN = 0;
		//(N-1)の約数をカウント
		long divCounterN2 = 0;

		//約数を数え上げ
		long root = (long)Math.Sqrt(N);
		long root2 = (long)Math.Sqrt(N-1);

		//Nの約数について調査
		for(long i=1; i<=root; i++){
				if(N % i == 0){
						//約数iがKとなる場合についてカウント
						if(i != 1){
								long K = i;
								long div = N;
								while(div % K == 0){
										div /= K;
								}
								if(div % K == 1){
										divCounterN ++;
								}
						}

						//約数N/iについても同様に検証
						long K2 = N/i;
						long div2 = N;
						while(div2 % K2 == 0){
								div2 /= K2;
						}
						if(div2 % K2 == 1){
								divCounterN ++;
						}

						//平方根の場合は二重に加算していることに注意
						if(i*i == N){
								divCounterN --;
						}
				}
		}

		//N-1の約数を調査
		for(long i=1; i<=root2; i++){
				if((N-1) % i == 0){
						divCounterN2 ++;
				}
		}

		if((N-1)!= 1){
				divCounterN2 *= 2;
				if(root2*root2 == (N-1)){
						divCounterN2 --;
				}
		}

		/*debug
		Console.WriteLine(divCounterN);
		Console.WriteLine(divCounterN2);
		*/

		//両者を加算
		long answer = divCounterN + divCounterN2;

		//(N-1)の約数1の分を減算（Nを1で割っても余らない）
		//（1は、NとN-1の唯一の公約数）
		answer --;

		Console.WriteLine(answer);

	}
}