#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

typedef long long ll;

ll N;

int main() {
	cin >> N;
	N *= 2;
	vector<ll> yakusu;
	for (ll i = 1; i * i <= N; i++) {
		if (N % i == 0) {
			yakusu.push_back(i);
			yakusu.push_back(N / i);
		}
	}
	sort(yakusu.begin(), yakusu.end());

	//初項x, 項数bの等差数列の和はxb + b * (b - 1) / 2 == N
	int ans = 0;
	for (int i = 0; i < yakusu.size(); i++) {
		ll b = yakusu[i];
		ll x2 = (N / b + 1 - b);
		if (x2 % 2 == 0)ans++;
	}
	
	cout << ans << endl;

	return 0;
}
#include<bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <chrono> 
// using namespace std::chrono; 
// using namespace __gnu_pbds;

#define ff              first
#define ss              second
#define int             long long
#define double          long double
#define pb              push_back
#define mp              make_pair
#define pi              pair<int,int>
#define vtiii           vector<tuple<int,int,int>>
#define vi              vector<int>
#define vpii            vector<pair<int,int>
#define mii             map<int,int>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int>>
#define setbits(x)      __builtin_popcountll(x)
#define zrobits(x)      __builtin_ctzll(x)
#define inf             1e18  
// #define ps(x,y)         fixed<<setprecision(y)<<x
#define mk(arr,n,type)  type *arr=new type[n];
#define all(x) (x).begin(), (x).end()
#define FIO             ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) 
mt19937                 rng(chrono::steady_clock::now().time_since_epoch().count());
 
// typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;

#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x <<" "; _print(x); cerr << endl;
#else
#define debug(x)
#endif

void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(double t) {cerr << t;}

template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.ff); cerr << ","; _print(p.ss); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}
 
const int mxN = 1e7;
const int mod = 1e9 + 7;

void solve(){
    int n;cin>>n;
    int x = 0;
    cout<<n-1<<endl;

    
}
                                                                                                            
int32_t main(){
    // auto start = high_resolution_clock::now()
    FIO;
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
        freopen("Error.txt", "w", stderr);
    #endif
    // precalc();
    //int x; cin>>x; while(x--) 
    solve(); 
    // auto stop = high_resolution_clock::now(); 
    // auto duration = duration_cast<microseconds>(stop - start); 
    // cout << duration.count() << endl;
}