#include <bits/stdc++.h>

using namespace std;

using int64 = long long;
const int mod = 1e9 + 7;

const int64 infll = (1LL << 62) - 1;
const int inf = (1 << 30) - 1;

struct IoSetup {
  IoSetup() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);
    cerr << fixed << setprecision(10);
  }
} iosetup;


template< typename T1, typename T2 >
ostream &operator<<(ostream &os, const pair< T1, T2 > &p) {
  os << p.first << " " << p.second;
  return os;
}

template< typename T1, typename T2 >
istream &operator>>(istream &is, pair< T1, T2 > &p) {
  is >> p.first >> p.second;
  return is;
}

template< typename T >
ostream &operator<<(ostream &os, const vector< T > &v) {
  for(int i = 0; i < (int) v.size(); i++) {
    os << v[i] << (i + 1 != v.size() ? " " : "");
  }
  return os;
}

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

template< typename T1, typename T2 >
inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); }

template< typename T1, typename T2 >
inline bool chmin(T1 &a, T2 b) { return a > b && (a = b, true); }

template< typename T = int64 >
vector< T > make_v(size_t a) {
  return vector< T >(a);
}

template< typename T, typename... Ts >
auto make_v(size_t a, Ts... ts) {
  return vector< decltype(make_v< T >(ts...)) >(a, make_v< T >(ts...));
}

template< typename T, typename V >
typename enable_if< is_class< T >::value == 0 >::type fill_v(T &t, const V &v) {
  t = v;
}

template< typename T, typename V >
typename enable_if< is_class< T >::value != 0 >::type fill_v(T &t, const V &v) {
  for(auto &e : t) fill_v(e, v);
}

template< typename F >
struct FixPoint : F {
  FixPoint(F &&f) : F(forward< F >(f)) {}

  template< typename... Args >
  decltype(auto) operator()(Args &&... args) const {
    return F::operator()(*this, forward< Args >(args)...);
  }
};

template< typename F >
inline decltype(auto) MFP(F &&f) {
  return FixPoint< F >{forward< F >(f)};
}


class SegmentMap : public std::map< int64, int64 > {
private:
public:
  // if merge [l, c] and [c+1, r], set flagToMergeAdjacentSegment to true

  // __exist -> iterator pair(l, r) (contain p)
  // noexist -> map.end()
  auto get(int64 p) const {
    auto it = upper_bound(p);
    if(it == begin() || (--it)->second < p) return end();
    return it;
  }

  // insert segment [l, r]
  void insert(int64 l, int64 r) {
    auto itl = upper_bound(l), itr = upper_bound(r);
    if(itl != begin()) {
      if((--itl)->second < l) ++itl;
    }
    if(itl != itr) {
      l = std::min(l, itl->first);
      r = std::max(r, std::prev(itr)->second);
      erase(itl, itr);
    }
    (*this)[l] = r;
  }
};

int main() {
  int N, X, D;
  cin >> N >> X >> D;

  if(D == 0) {
    if(X == 0) {
      cout << 1 << endl;
    } else {
      cout << N + 1 << endl;
    }
    return 0;
  }

  vector< int64 > sum{X};
  for(int i = 2; i <= N; i++) {
    sum.emplace_back(sum.back() + D);
  }
  sort(begin(sum), end(sum));

  // i個選ぶときの総和
  vector< int64 > pre{0};
  for(int i = 0; i < N; i++) pre.emplace_back(pre.back() + sum[i]);
  vector< int64 > suf{0};
  reverse(begin(sum), end(sum));
  for(int i = 0; i < N; i++) suf.emplace_back(suf.back() + sum[i]);


  int64 ret = 0;
  map< int64, SegmentMap > seg;
  for(int i = 1; i <= N; i++) {
    int64 l = pre[i];
    int64 r = suf[i];
    seg[(1LL * i * X) % D].insert(l, r);
  }
  D = abs(D);
  bool zero = true;
  for(auto &p : seg) {
    for(auto &q : p.second) {
      ret += (q.second - q.first) / D + 1;
      if(q.first <= 0 && q.second >= 0 && q.first % D == 0)zero = false;
    }
  }
  cout << ret + zero << endl;
}



Measured memory_bytes: 36208