#include <bits/stdc++.h>
using namespace std;
int dp[20010][3][2];
int n;
int can(int a, int b) {
  int c = b - a;
  int x = 1;
  if (a < c) swap(a, c);
  while (2 * x - 1 <= a && 2 * x - 1 <= c) {
    x *= 2;
  }
  if (2 * x - 1 >= a) {
    return 1;
  }
  return false;
}
int rec(int sz, int c, int v) {
  if (sz == 1) {
    return c == v;
  }
  if (sz == 2) {
    return c != v;
  }
  if (sz == 3) {
    return 0;
  }
  int &res = dp[sz][c][v];
  if (res != -1) return res;
  res = 0;
  for (int i = 1; i + 1 < sz; i++) {
    if (can(i, sz - 1) && (i + c) % 2 == v) {
      res += rec(i, c, 1 - v) * rec(sz - i - 1, 1 - v, v);
    }
  }
  return res;
}
int main() {
  memset(dp, -1, sizeof dp);
  cin >> n;
  vector<pair<int, pair<int, int> > > D;
  set<pair<int, pair<int, int> > > S;
  for (int i = 1; i <= 2000; i++) {
    if (rec(i, 1, 0) == 1) {
      D.push_back(make_pair(i, make_pair(1, 0)));
    }
    if (rec(i, 1, 1) == 1) {
      D.push_back(make_pair(i, make_pair(1, 1)));
    }
    if (rec(i, 0, 0) == 1) {
      D.push_back(make_pair(i, make_pair(0, 0)));
    }
    if (rec(i, 0, 1) == 1) {
      D.push_back(make_pair(i, make_pair(0, 1)));
    }
  }
  for (int i = 0; i < D.size(); i++) {
    S.insert(D[i]);
  }
  for (int it = 0; it < 100; it++) {
    int F = 0;
    for (int i = 0; F == 0 && i < D.size(); i++) {
      for (int j = 0; F == 0 && j < D.size(); j++) {
        int A = D[i].first + D[j].first + 1;
        if (A > n) continue;
        int c = D[i].second.first;
        int v = 1 - D[i].second.second;
        if (D[j].second.second != v) continue;
        if ((D[i].first + c) % 2 != v) continue;
        int cc = 1 - v;
        if (D[j].second.first != cc) continue;
        if (S.count(make_pair(A, make_pair(c, v)))) continue;
        if (can(D[i].first, A - 1)) {
          S.insert(make_pair(A, make_pair(c, v)));
          D.push_back(make_pair(A, make_pair(c, v)));
          F = 1;
        }
      }
    }
  }
  cout << S.count(make_pair(n, make_pair(1, n % 2))) << "\n";
  return 0;
}
