import random


# Does a bunch of ternary searches on random intervals.
# Quite good, except if maximum is close to an endpoint.


def f(x):
    if x > n//k or n - x*k > m*(k-1) or x < 0:
        return -1
    result = x*n - (k*x*(x-1))//2
    n2 = n - x*k
    k2 = n2//m + 1
    x2 = n2 - m*(n2//m)
    result += x2*n2 - (k2*x2*(x2-1))//2
    n3 = n2 - x2*k2
    k3 = k2-1
    x3 = m-x2
    result += x3*n3 - (k3*x3*(x3-1))//2
    return result

def TS(l,r,d):
    res = max(f(l),f(r))
    
    while l < r-3:
        mid1 = (2*l + r)//3
        mid2 = (l + 2*r)//3
        res1 = f(mid1)
        res2 = f(mid2)
        res = max(res, res1, res2)
        if res1 < res2:
            l = mid1
        else:
            r = mid2
    for i in range(l-d,l+d):
        res = max(res, f(i))
    return res
        

(n, m, k) = list(map(int, raw_input().split()))
X = 10**4
lo = max(0, n//k - m + m//k)
hi = n//k + 1
ans = 0
for i in range(0,X):
    l = random.randint(lo,hi)
    r = random.randint(lo,hi)
    if l > r:
        (l,r) = (r,l)
    ans = max(ans,TS(l,r,5))

print(ans)

