#include <string>
#include <iostream>
#include <stack>
#include <queue> // priority_queue も入ってる
#include <set>   // 要素数は size() で取得 multisetもある
#include <map>
#include <array> // sizeはコンパイル時定数で固定
#include <vector>
#include <numeric>   // accumulate, gcd
#include <algorithm> // count_ifに必要
#include <iomanip>   // cout << setprecision(15) << x で小数の出力精度を指定
#include <tuple>
#include <utility> //pair
#include <cmath>
#include <random>

using namespace std;
using ll = long long;

#define rep(i, n) for (int i = 0; i < (n); ++i)

// 小さい順(昇順)で約数をすべて列挙します。
vector<ll> allDivisors(ll n)
{

    vector<ll> result;

    for (ll i = 1; i <= n / i; ++i)
    {

        if (n % i == 0)
        {
            result.push_back(i);
            if (n / i != i)
            {
                result.push_back(n / i);
            }
        }
    }

    sort(result.begin(), result.end());

    return result;
}

int main()
{

    ll n;
    cin >> n;
    n *= 2;
    vector<ll> alld = allDivisors(n);
    ll count = 0;
    for (ll k : alld)
    {
        ll e = n / k;
        if ((e - k + 1) % 2 == 0)
        {
            count++;
        }
    }
    cout << count << endl;

    return 0;
}
#include<bits/stdc++.h>
#define rep(i,n) for (int i=0; i<n; i++)
#define REP(i,x,n) for (int i=x; i<n; i++)
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using ll = long long;
#define P pair<ll,ll>
#define T tuple<int, int, int>
#define PP pair<P,P>
#define ALL(a) a.begin(), a.end()



int main(){
    int n;
    cin >> n;

    vi ans(n);
    ans[0] = 1;
    REP(i,1,n){
        int MAX = 0;
        i++;
        for (int j=1; j*j<=i; j++){
            if (i % j == 0){
                MAX = max(MAX, ans[j-1]);
                MAX = max(MAX, ans[i/j-1]);
            }
        }
        i--;
        ans[i] = MAX + 1;
    }

    rep(i,n){
        cout << ans[i];
        if (i < n - 1) cout << " ";
        else cout << endl;
    }
}