Problem:
Score : 600 points

Problem Statement

We have an integer sequence A of length N, where A_1 = X, A_{i+1} = A_i + D (1 \leq i < N ) holds.

Takahashi will take some (possibly all or none) of the elements in this sequence, and Aoki will take all of the others.

Let S and T be the sum of the numbers taken by Takahashi and Aoki, respectively. How many possible values of S - T are there?

Constraints

-10^8 \leq X, D \leq 10^8

1 \leq N \leq 2 \times 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N X D

Output

Print the number of possible values of S - T.

Sample Input 1

3 4 2

Sample Output 1

8

A is (4, 6, 8).

There are eight ways for (Takahashi, Aoki) to take the elements: ((), (4, 6, 8)), ((4), (6, 8)), ((6), (4, 8)), ((8), (4, 6))), ((4, 6), (8))), ((4, 8), (6))), ((6, 8), (4))), and ((4, 6, 8), ()).

The values of S - T in these ways are -18, -10, -6, -2, 2, 6, 10, and 18, respectively, so there are eight possible values of S - T.

Sample Input 2

2 3 -3

Sample Output 2

2

A is (3, 0). There are two possible values of S - T: -3 and 3.

Sample Input 3

100 14 20

Sample Output 3

49805

Solution in Lua (Lua 5.3.5) (judge verdict: Accepted)

local mfl, mce = math.floor, math.ceil
local mmi, mma = math.min, math.max
local n, x, d = io.read("*n", "*n", "*n")
if d == 0 then
  if x == 0 then print(1)
  else print(n + 1)
  end
  os.exit()
elseif d < 0 then
  x, d = -x, -d
end
local ret = 0
local min, max = 0, 0
local t = {}
t[0] = {}
table.insert(t[0], {0, 0})
for i = 1, n do
  min = min + i - 1
  max = max + n - i
  local v = x * i
  local quot = mfl(v / d)
  local rem = v - quot * d
  if rem < 0 then
    rem = rem + d
    quot = quot - 1
  end
  if not t[rem] then t[rem] = {} end
  table.insert(t[rem], {quot + min, quot + max})
end
for k, tbl in pairs(t) do
  table.sort(tbl, function(a, b) return a[1] < b[1] end)
  local curleft, curright = tbl[1][1], tbl[1][2]
  for i = 2, #tbl do
    local l, r = tbl[i][1], tbl[i][2]
    if l <= curright + 1 then
      curright = mma(curright, r)
    else
      ret = ret + (curright - curleft + 1)
      curleft, curright = l, r
    end
  end
  ret = ret + (curright - curleft + 1)
end
print(ret)