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

template<typename T>
istream& operator >> (istream& istr, vector<T>& v){
    for(T& x: v) istr >> x;
    return istr;
}

template<typename T, typename U>
istream& operator >> (istream& istr, pair<T,U>& p){
    istr >> p.first >> p.second;
    return istr;
}

template<typename T>
ostream& operator << (ostream& ostr, vector<T>& v){
    if(!v.empty()){
        ostr << v.front();
        for(auto itr = ++v.begin(); itr != v.end(); itr++)
            // ostr << *itr;
            ostr << " " << *itr;
    }
    return ostr;
}

template<typename T, typename U>
ostream& operator << (ostream& ostr, pair<T,U>& p){
    // ostr << p.first << p.second;
    ostr << p.first << ", " << p.second;
    return ostr;
}

template<typename T>
ostream& operator << (ostream& ostr, vector<vector<T>>& vv){
    if(!vv.empty()){
        ostr << vv.front();
        for(auto itr = ++vv.begin(); itr != vv.end(); itr++)
            ostr << endl << *itr;
    }
    return ostr;
}

template<typename T, typename U>
ostream& operator << (ostream& ostr, vector<pair<T,U>>& vp){
    if(!vp.empty()){
        ostr << vp.front();
        for(auto itr = ++vp.begin(); itr != vp.end(); itr++)
            ostr << endl << *itr;
    }
    return ostr;
}

typedef long long ll;
typedef vector<ll> vll;
typedef vector<char> vc;
typedef vector<double> vd;
// vll x(n); x[i]=a;
typedef vector<vll> vvll;
typedef vector<vc> vvc;
typedef vector<vd> vvd;
// vvll x(m,vi(n)); x[i][j]=a;
typedef pair<ll,ll> pll;
typedef pair<double,double> pd;
typedef vector<pll> vpll;
typedef vector<pd> vpd;
// vpll x(n); x[i]={a,b}; x[i].first/second;

#define PI 3.1415926535897932
#define EPS 1e-12
#define INF (ll)1e+12
#define REP(i,n) for(ll i=0; i<(n); i++)
#define RREP(i,n) for(ll i=(n)-1; i>=0; i--)
#define FOR(i,a,b) for(ll i=(a); i<(b); i++)
#define FORR(i,a,b) for(ll i=(b)-1; i>=(a); i--)
#define fix(x) cout << fixed << setprecision(x)
#define dump(x) cout << #x << " = " << (x) << endl
#define all(x) (x).begin(),(x).end()

template<typename T> T sum(vector<T>& v){return accumulate(all(v), (T)0);}
template<typename T> inline void sort(vector<T>& v){sort(all(v));}
template<typename T> inline void rsort(vector<T>& v){sort(all(v), greater<T>());}
template<typename T> inline void chmin(T& a, T b){if(a>b) a=b;}
template<typename T> inline void chmax(T& a, T b){if(a<b) a=b;}

// 素因数分解
vpll prime_fac(ll x){
    vpll ans;
    ll tmp = 0;
    ll s = sqrt(x);
    while(x % 2 == 0){
        x /= 2;
        tmp++;
    }
    if (tmp > 0) ans.emplace_back(pll{2, tmp});
    for(ll y = 3; y <= s; y += 2){
        tmp = 0;
        while(x % y == 0){
            x /= y;
            tmp++;
        }
        if (tmp > 0) ans.emplace_back(pll{y, tmp});
    }
    if (x>1) ans.emplace_back(pll{x, 1});
    return ans;
}

vll divisor(ll x){
    vll ans;
    for(ll i=1; i*i<=x; i++){
        if(x%i==0){
            ans.emplace_back(i);
            if(x!=i*i) ans.emplace_back(x/i);
        }
    }
    sort(ans);
    return ans;
}

int main(){
    ll n, m, ans=1;
    cin >> n;

    vpll p = prime_fac(n-1);
    vll q = divisor(n);

    REP(i,p.size()) ans*=(p[i].second+1);
    ans--;

    REP(i,q.size()){
        ll f = q[i];
        if(f==1) continue;
        m=n;
        while(m%f==0) m/=f;
        if(m%f==1) ans++;
    }

    cout << ans << endl;
    return 0;
}


Measured memory_bytes: 384