#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
long long s, bit[66], cnt, ans, f[66][155][2];
long long dp(long long s, long long tot, long long h1, long long h2) {
  memset(f, 0, sizeof(f));
  f[0][0][0] = 1;
  int ed = log2(s);
  for (long long i = 1; i <= ed; i++)
    for (long long j = 0; j <= i * 2 - 2; j++)
      for (long long k = 0; k <= 1; k++)
        for (long long p1 = 0; p1 <= 1; p1++) {
          if (i >= h1 && p1) break;
          for (long long p2 = 0; p2 <= 1; p2++) {
            if (i >= h2 && p2) break;
            if ((p1 + p2 + k) % 2 == ((s >> i) & 1))
              f[i][j + p1 + p2][(p1 + p2 + k) / 2] += f[i - 1][j][k];
          }
        }
  return f[ed][tot][0];
}
int main() {
  scanf("%lld", &s);
  bit[0] = 1;
  for (; bit[cnt] <= s;) cnt++, bit[cnt] = bit[cnt - 1] * 2;
  bit[cnt + 1] = bit[cnt] * 2;
  for (long long i = 1; i <= cnt; i++) {
    if (s < (bit[i] - 1)) break;
    long long ret = s % (bit[i] - 1);
    for (long long j = i; j >= 1; j--)
      if (ret >= bit[j] - 1) ret -= bit[j] - 1;
    if (!ret) ans++;
  }
  for (long long h1 = 1; h1 <= cnt; h1++)
    for (long long h2 = 1; h2 <= cnt; h2++) {
      if ((s - bit[h2] + 1) < (bit[h1 + 1] + bit[h2 + 1] - 3)) break;
      long long ret = (s - bit[h2] + 1) % (bit[h1 + 1] + bit[h2 + 1] - 3);
      if (ret == 0) {
        ans++;
        continue;
      }
      for (long long n = 1; n <= h1 + h2; n++)
        if ((ret + n) % 2 == 0) ans += dp(ret + n, n, h1, h2);
    }
  printf("%lld", ans);
}
