#include<bits/stdc++.h>
using namespace std;
#define ll long long int
typedef unsigned long long int ull;
typedef long double ldb;
#define B 1000000007
#define rep(i,a,b) for(ll i=a;i<b;i++)
#define repi(i,a,b) for(ll i=b-1;i>=a;i--)
#define MT make_tuple
#define G(a,b) get<a>(b)
#define VI vector<int>
#define VLL vector<long long int>
#define pb push_back
#define mp make_pair
#define ani ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
/*SOME BITMASK KNOWLEDGE
1)x & (x - 1):sets the last one bit of x to zero
power of two exactly when x & (x − 1) = 0.
2)x & -x:sets all the one bits to zero, except last one bit
3)x | (x - 1):inverts all the bits after the last one bit
4)(a^b) = (a|b)-(a&b) = (a+b-2*(a&b))
5)(a+b) = a^b + 2*(a&b)
6)   lowest set bit of N =n ^ ( n & (n-1));
7)    Turn off 1st set bit= n^(n&(-n));
8) clear all bits from MSB to ith bit  = n&((1<<i)-1);    
9) clear all bits from LSB= n&(~((1<<(i+1))-1))      
10) if a%m<0 then compute (a%m+m)%m    */


#define endl "\n"


ll gcd(ll  a, ll  b) { 
   if (b == 0) 
      return a; 
   return gcd(b, a % b);  
} 
 
ll lcm(ll a, ll b){ 
    return (a*b)/(gcd(a, b));
}
ll max(ll a, ll b){
  if (a > b)
    return a;
  return b;
}

 
ll bins(ll ar[],ll l,ll r,ll x) 
{ 
    if (r >= l) { 
        ll mid =l+((r-l)/2); 
        if(ar[mid]==x) 
            return mid; 
        if(ar[mid]>x) 
            return bins(ar,l,mid-1,x);
        return bins(ar,mid+1,r,x); 
    } 
    return -1; 
} 
 
ll nCr(ll n,ll k){ 
    ll C[n + 1][k + 1]; 
    ll i, j; 
    for (i=0;i<=n;i++){ 
        for(j=0;j<=min(i,k);j++){
            if(j==0||j==i) 
                C[i][j]=1;  
            else
                C[i][j]=C[i-1][j-1]+C[i-1][j]; 
        } 
    }
    return C[n][k]; 
} 
 
 
 ll decimalToBinary(ll N) 
{ 
  
    // To store the binary number 
    ll B_Number = 0; 
    ll cnt = 0; 
    while (N != 0) { 
        ll rem = N % 2; 
        ll c = pow(10, cnt); 
        B_Number += rem * c; 
        N /= 2; 
  
        // Count used to store exponent value 
        cnt++; 
    } 
  
    return B_Number; 
} 


int countFreq(string &pat, string &txt) 
{ 
    int M = pat.length(); 
    int N = txt.length(); 
    int res = 0; 
    
    /* A loop to slide pat[] one by one */
    for (int i = 0; i <= N - M; i++) 
    {  
        /* For current index i, check for  
           pattern match */
        int j; 
        for (j = 0; j < M; j++) 
            if (txt[i+j] != pat[j]) 
                break; 
   
        // if pat[0...M-1] = txt[i, i+1, ...i+M-1] 
        if (j == M)   
        {  
           res++; 
           j = 0; 
        } 
    } 
    return res; 
} 


int lis(int a[],int n)
{
    int b[n];
    b[0]=1;
    for (int i = 1; i < n; ++i)
    {
        b[i]=1;
    for(int j=i-1;j>=0;j--)
    {
        if(a[j]>a[i])
            continue;
        int p=b[j]+1;
        if(p>a[i])
            a[i]=p;
    }
    }
    int best=0;
    for (int i = 0; i < n; i++) {
        if (best < b[i]) {
            best = b[i];
        }
    }
return best;
}



int count_ways_to_make_change(int s[],int m,int n)
{
    int i,j,x,y;
    int table[n+1][m];

for( i=0;i<m;i++)
{ table[0][i]=1;
}

for(i=1;i<n+1;i++)
{
    for(j=0;j<m;j++)
    {
        x=(i-s[j]>=0)?table[i-s[j]][j]:0; //count of sols including s[j]
        y=(j>=1)?table[i][j-1]:0; // count of sols excluding s[j]

        table[i][j]=x+y;  //total count
    }

}
return table[n][m-1];

}


ll kadane(ll a[],ll n)
{
    ll curr=0;
    ll best=0;
    for(ll i=0;i<n;i++)
    {
        curr+=a[i];
        if(best<curr)
        {
            best=curr;
        }
        if(curr<0)
            curr=0;
    }
    return best;
}

int maxSum(int arr[], int n, int k) //maximum sum of a subarray of size k
{ 
    if (n < k) 
    { 
       cout << "Invalid"; 
       return -1; 
    } 

    int res = 0; 
    for (int i=0; i<k; i++) 
       res += arr[i]; 

    int curr_sum = res; 
    for (int i=k; i<n; i++) 
    { 
       curr_sum += arr[i] - arr[i-k]; 
       res = max(res, curr_sum); 
    } 
  
    return res; 
} 
  
  std::vector<ll> v;
ll countDivisors(ll n) 
{ 
    ll cnt = 0; 
    for (ll i = 1; i <= sqrt(n); i++) 
    { 
        if (n % i == 0) 
        { if(i!=1)
                  v.pb(i);
            // If divisors are equal, 
            // count only one 
            if (n / i == i) 
                {cnt++;
                 
                    }
  
            else // Otherwise count both 
            {cnt = cnt + 2; 
                if(n/i!=1) v.pb(n/i);}
        } 
    } 
    return cnt; 
} 
int main()
{ 
ani;

   ll n;
    cin>>n;


ll p1=countDivisors(n);
vector<ll> ::iterator i; 
ll c=0;
for(i=v.begin();i<v.end();i++)
{ 
    ll t=n;

    if(t%(*i)==0)
   {

       while(t%(*i)==0)
         {
            t/=(*i);

         }

       

     if(t%(*i)==1)
         {
            c++;
         }

    }


}
c+=countDivisors(n-1);

cout<<c-1;



 


return 0;
}

Measured memory_bytes: 384