#pragma GCC optimize("Ofast")
#define _USE_MATH_DEFINES
#include "bits/stdc++.h"

using namespace std;

using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;
using i8 = int8_t;
using i16 = int16_t;
using i32 = int32_t;
using i64 = int64_t;

constexpr char newl = '\n';
constexpr double eps = 1e-10;

#define FOR(i,a,b) for (int i = (a); i < (b); i++)
#define F0R(i,b) FOR(i,0,b)
#define RFO(i,a,b) for (int i = ((b)-1); i >=(a); i--)
#define RF0(i,b) RFO(i,0,b)
#define fi first
#define se second
#define debug(x) cout << #x << ": " << x << '\n';
#define rng(a) a.begin(),a.end()
#define rrng(a) a.rbegin(),a.rend()

template<typename T1, typename T2> inline void chmin(T1& a, T2 b) { if (a > b) a = b; }
template<typename T1, typename T2> inline void chmax(T1& a, T2 b) { if (a < b) a = b; }
template<class T> void Print(vector<T> v) {
  F0R(i, v.size()) {
    cout << v[i] << ' ';
  }
  cout << newl;
}

#if 1

i64 gcd(i64 a, i64 b) { return b ? gcd(b, a % b) : a; }
i64 lcm(i64 a, i64 b) { return a / gcd(a, b) * b; }

// [L, R) の範囲を扱うクラス
template<class T=int>
class Range {
  static bool lcmp(const pair<T, T>& l, const pair<T, T>& r) {
    return l.first < r.first;
  };

public:
  void Clear() {
    rs.clear();
  }

  void Add(pair<T, T> v) {
    int idx = lower_bound(rng(rs), v, lcmp) - rs.begin();
    // 右側と結合
    while (idx < rs.size()) {
      if (rs[idx].first <= v.second) {
        chmax(v.second, rs[idx].second);
        rs.erase(rs.begin() + idx);
      }
      else break;
    }
    // 左側と結合
    while (idx > 0) {
      if (v.first <= rs[idx - 1].second) {
        idx--;
        chmin(v.first, rs[idx].first);
        chmax(v.second, rs[idx].second);
        rs.erase(rs.begin() + idx);
      }
      else break;
    }
    rs.insert(rs.begin() + idx, v);
  }

  void CutOut(const pair<T, T>& v, Range &dest) {
    dest.Clear();
    int idx = lower_bound(rng(rs), v, lcmp) - rs.begin();
    // 左端
    if (idx > 0) {
      if (v.first < rs[idx - 1].second) {
        dest.rs.emplace_back(v.first, rs[idx - 1].second);
        rs[idx - 1].second = v.first;
      }
    }
    // それ以降
    while (idx < rs.size() && rs[idx].first < v.second) {
      dest.rs.emplace_back(rs[idx].first, min(rs[idx].second, v.second));

      if (rs[idx].second <= v.second) {
        rs.erase(rs.begin() + idx);
      }
      else {
        rs[idx].first = v.second;
        break;
      }
    }
  }

  T Size() {
    T size = 0;
    F0R(i, rs.size()) {
      size += rs[i].second - rs[i].first;
    }
    return size;
  }

  void Print() {
    F0R(i, rs.size()) {
      cout << "[" << rs[i].first << ", " << rs[i].second << ")" << newl;
    }
  }

  vector<pair<T, T>> rs;
};

// INSERT ABOVE HERE
signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  int N, X, D;
  cin >> N >> X >> D;

  // 数列の合計をUとおく
  // S-T = S-(U-S) = S*2-U
  // つまり差は関係なく、Sが何通りあるか分かれば良い

  // X+D*0, X+D*1, X+D*2, ... , X+D*(N-1)

  // Sのとりうる値
  // * 0個とるとき
  // 0
  // * 1個とるとき
  // X+D*0 ~ X+D*(N-1)
  // * 2個とるとき
  // X*2+D*1 ~ X*2+D*(N*2-3)
  // * 3個とるとき
  // X*3+D*3 ~ X*3+D*(N*3-6)
  //
  // * i個とるとき
  //         i-1                 i
  // X*i + D*Σj ~ X*i + D*(N*i-Σj)
  //         j=1                j=1
  //
  // * N個とるとき
  // X*N + D*N*(N-1)/2
  //
  // これらのうち、いくつ重複するかを全体から引く

  i64 result = 0;

  if (D == 0) {
    if (X == 0) {
      cout << 1;
      return 0;
    }

    cout << (N + 1);
    return 0;
  }

  int ax = abs(X), ad = abs(D);
  i64 xdm = X == 0 ? 0 : ::lcm(ax, ad);
  i64 axm = X == 0 ? 1 : xdm / ax, adm = xdm / ad;
  if (ax < 0) xdm = -xdm;
  if (ad < 0) xdm = -xdm;
  
  //cout << xdm << newl;

  int loop = min<int>(axm, N);
  vector<Range<i64>> rs(loop);
  i64 ds = xdm/D;
  if (X < 0) ds = -ds;
  i64 sj = 0;

  // 0個とるとき
  rs[0].Add({ 0, 1 });

  FOR(i, 1, N + 1) {
    i64 l = sj; // Dの係数,min
    sj += i;
    i64 r = (i64)N * i - sj;  // Dの係数,max

    // Dの係数をXの分だけずらす
    l += i / loop * ds;
    r += i / loop * ds;
    //cout << l << ',' << r << newl;

    rs[i % loop].Add({ l,r + 1 });
  }

  F0R(i, rs.size()) {
    result += rs[i].Size();
  }

  cout << result;
}
#endif


Measured memory_bytes: 11136