You are given positive integer number n. You should create such strictly increasing sequence of k positive numbers a_1, a_2, ..., a_{k}, that their sum is equal to n and greatest common divisor is maximal.

Greatest common divisor of sequence is maximum of such numbers that every element of sequence is divisible by them.

If there is no possible sequence then output -1.


-----Input-----

The first line consists of two numbers n and k (1 ≤ n, k ≤ 10^10).


-----Output-----

If the answer exists then output k numbers — resulting sequence. Otherwise output -1. If there are multiple answers, print any of them.


-----Examples-----
Input
6 3

Output
1 2 3

Input
8 2

Output
2 6

Input
5 3

Output
-1

Source: codeforces | Difficulty: HARD
Tags: Greedy algorithms

Mathematics

Constructive algorithms


Solutions:
import math

def divisorGenerator(n):
	large_divisors = []
	for i in range(1, int(math.sqrt(n) + 1)):
		if n % i == 0:
			yield i
			if i * i != n:
				large_divisors.append(n / i)
	for divisor in reversed(large_divisors):
		yield divisor

def result(n, k):
	Main = []
	Last = n
	for i in range(1, n * 2):
		if k == 1:
			break
		Main.append(i)
		Last -= i
		k -= 1
	Main.append(Last)
	return Main
(n, k) = list(map(int, input().split()))
divisors = list(divisorGenerator(n))
for i in range(len(divisors)):
	divisors[i] = int(divisors[i])
kk = (k ** 2 + k) // 2
if n < kk:
	print(-1)
else:
	oo = n // kk
	pp = 1
	for i in divisors:
		if i <= oo:
			pp = i
	oo = pp
	w = result(n // oo, k)
	s = ''
	for i in w:
		s += ' ' + str(i * oo)
	print(s[1:])


import math
(n, k) = map(int, input().split())

def solve(i):
	a = i * k * (k + 1) // 2
	if n >= a:
		return n - a
	else:
		return -1
i = 1
r = -1
while i * i <= n:
	if n % i == 0:
		if solve(i) > -1:
			r = max(r, i)
		if i * i != n:
			if solve(n / i) > -1:
				r = max(r, n / i)
	i = i + 1
if r == -1:
	print(r)
else:
	b = []
	for i in range(1, k):
		b.append(i * r)
	b.append(k * r + solve(r))
	for i in b:
		print(int(i), end=' ')
	print()


import math
(n, k) = list(map(int, input().split()))
if k * (k + 1) / 2 > n:
	print(-1)
else:
	c = int(n / (k * (k + 1) / 2))
	a = []
	for i in range(1, int(math.sqrt(n) + 1)):
		if i * i == n:
			a.append(i)
		elif n % i == 0:
			a.append(i)
			a.append(n // i)
	a = sorted(a)
	s = 0
	for i in range(len(a)):
		s += 1
		if a[i] > c:
			break
	c = a[s - 2]
	ans = list(map(str, list(range(c, c * k, c))))
	ans.append(str(int(n - c * (k * (k - 1) / 2))))
	print(' '.join(ans))


import sys
import math
(n, k) = map(int, input().split())
x = k * (k + 1) // 2
cur = 1
s = math.sqrt(n)
div = 0
while cur <= s:
	if n % cur == 0:
		if n // cur >= x:
			div = max(div, cur)
		if cur >= x:
			div = max(div, n // cur)
	cur += 1
if div == 0:
	print(-1)
	sys.exit()
rest = n // div
for i in range(1, k + 1):
	if i == k:
		print(div * rest, end=' ')
	else:
		print(div * i, end=' ')
	rest -= i


import sys
from math import sqrt
[n, k] = map(int, input().strip().split())
if k * (k + 1) > 2 * n:
	print(-1)
	sys.exit(0)
a0max = 2 * n // (k * (k + 1))
d = 1
for i in range(1, min(a0max, int(sqrt(n))) + 1):
	if n % i == 0:
		d = max(d, i)
		if a0max * i >= n:
			d = max(d, n // i)
res = [(i + 1) * d for i in range(k - 1)]
res.append(n - d * (k * (k - 1)) // 2)
print(' '.join(map(str, res)))


(n, k) = map(int, input().split())
g = n * 2 // ((k + 1) * k)
if not g:
	print(-1)
	exit(0)
ee = [2 ** i for i in range(31) if not n % 2 ** i]
x = n // ee[-1]
oo = [(o, x // o) for o in range(1, int(x ** 0.5) + 1, 2) if not x % o]
g = max((o * e for t in oo for o in t for e in ee if o * e <= g))
print(' '.join(map(str, range(g, g * k, g))), n - g * (k - 1) * k // 2)


(n, k) = map(int, input().split())
D1 = [1]
D2 = []
nD = 1
d = 2
while d * d < n:
	if n % d == 0:
		D1 += [d]
		D2 = [n // d] + D2
		nD += 2
	d += 1
if d * d == n:
	D1 += [d]
	nD += 1
D = D1 + D2
(q, p) = (0, 0)
for j in range(nD - 1, -1, -1):
	d = D[j]
	if n % d == 0:
		x = n // d
		a = x - k * (k - 1) // 2
		if a >= k:
			(q, p) = (1, d)
			break
if q == 0:
	print(-1)
else:
	for i in range(1, k):
		print(i * p, end=' ')
	print(a * p)


import math
ls = list(map(int, input().split()))
n = ls[0]
k = ls[1]
if 2 * n < k * (k + 1):
	print(-1)
else:
	last = 1
	root = int(math.sqrt(n))
	for j in range(1, root + 1):
		if n % j == 0:
			if k * (k + 1) <= 2 * (n / j):
				if j > last:
					last = j
			if k * (k + 1) <= 2 * j:
				if n / j > last:
					last = n / j
	maxi = last
	output = ''
	for j in range(1, k):
		output += str(int(j * maxi))
		output += ' '
	output += str(int(n - maxi * ((k - 1) * k / 2)))
	print(output)


def to_str(arr):
	if arr == -1:
		return -1
	for i in range(len(arr)):
		arr[i] = str(arr[i])
	return ' '.join(arr)

def get_seq(n, k, mult=1):
	if n < round(k * (k + 1) / 2):
		return -1
	ans = []
	for i in range(k):
		ans.append((i + 1) * mult)
	ans[k - 1] = (n - round(k * (k - 1) / 2)) * mult
	return ans

def get_seq_new(n, k):
	if n < round(k * (k + 1) / 2):
		return -1
	pre_val = []
	for num in range(2, round(n ** 0.5) + 1):
		if n % num == 0:
			if num >= round(k * (k + 1) / 2):
				return get_seq(num, k, round(n / num))
			if round(n / num) >= round(k * (k + 1) / 2):
				pre_val = get_seq(round(n / num), k, num)
	if len(pre_val) > 0:
		return pre_val
	return get_seq(n, k)
s = input()
n = int(s.split(' ')[0])
k = int(s.split(' ')[1])
print(to_str(get_seq_new(n, k)))


def divisor_list(n):
	divisors = []
	d = 1
	while d * d <= n:
		if n % d == 0:
			divisors.append(d)
			if d != n // d:
				divisors.append(n // d)
		d += 1
	return sorted(divisors)
(n, k) = map(int, input().split())
divisors = divisor_list(n)
d = -1
for x in divisors:
	if k * (k + 1) // 2 <= n // x:
		d = x
if d == -1:
	print(-1)
else:
	ans = [i for i in range(1, k + 1)]
	ans[-1] += n // d - k * (k + 1) // 2
	print(*[d * x for x in ans])


(n, k) = map(int, input().split(' '))
best = -1
s = (k + 1) * k // 2
for d in range(1, int(n ** 0.5) + 1):
	if d * s > n:
		break
	if n % d == 0:
		best = d
		if n // d * s <= n:
			best = n // d
			break
if best == -1:
	print(-1)
else:
	for i in range(1, k):
		print(best * i, end=' ')
	print(best * k + n - best * s)


import sys
inf = 1 << 30

def solve():
	(n, k) = map(int, input().split())
	a = []
	b = []
	for d in range(1, n + 1):
		if d * d > n:
			break
		if n % d != 0:
			continue
		a.append(d)
		b.append(n // d)
	b.reverse()
	if a[-1] == b[0]:
		divs = a + b[1:]
	else:
		divs = a + b
	d_m = -1
	need = k * (k + 1) // 2
	for d in divs:
		q = n // d
		if q >= need:
			d_m = d
		else:
			break
	if d_m == -1:
		print(-1)
	else:
		ans = [0] * k
		for i in range(k - 1):
			ans[i] = (i + 1) * d_m
		ans[-1] = n - d_m * k * (k - 1) // 2
		print(*ans)

def __starting_point():
	solve()
__starting_point()


import sys, math, queue
MOD = 10 ** 9 + 7
sys.setrecursionlimit(1000000)
(n, k) = map(int, input().split())
f = []
i = 1
while i * i <= n:
	if n % i == 0:
		f.append(i)
		f.append(n // i)
	i += 1
f.sort(reverse=True)
for g in f:
	if k * (k + 1) // 2 <= n // g:
		x = [i for i in range(1, k)]
		x.append(n // g - k * (k - 1) // 2)
		for i in range(k):
			print(x[i] * g, end=' ')
		exit()
print(-1)


from math import sqrt
(n, k) = map(int, input().split())
K = k * (k + 1) // 2
if n < K:
	print(-1)
else:
	N = n // K
	ret = -1
	for i in range(1, min(N, int(sqrt(n))) + 1):
		if n % i == 0:
			if i > ret:
				ret = i
			ni = n // i
			if i < ni and ni <= N:
				if ni > ret:
					ret = ni
					break
	ans = [ret * i for i in range(1, k)]
	ans.append(n - sum(ans))
	print(' '.join(map(str, ans)))


(m, k) = map(int, input().split())
d = k * k + k >> 1
s = m // d
if s == 0:
	print(-1)
	exit()
(q, n) = (2, m)
p = [1]
while q * q <= n:
	if n % q == 0:
		n //= q
		t = [i * q for i in p if i * q <= s]
		p += t
		while n % q == 0:
			n //= q
			t = [i * q for i in t if i * q <= s]
			p += t
	q += 1
if n > 1:
	p += [i * n for i in p if i * n <= s]
s = max(p)
print(' '.join(map(str, range(s, s * k, s))), m - (d - k) * s)


(n, k) = map(int, input().split())
div = []
i = 1
n1 = n
while i * i <= n:
	if n % i == 0:
		div.append(i)
		div.append(n // i)
	i += 1
div.sort()
mx = -1
for i in range(len(div)):
	a = div[i] * k * (k + 1) // 2
	if a <= n:
		mx = div[i]
if mx == -1:
	print(-1)
else:
	for i in range(k - 1):
		print(mx * (i + 1), end=' ')
	print(n - mx * k * (k - 1) // 2)


(n, k) = map(int, input().split())
d = []
i = 1
while i * i <= n:
	if n % i == 0:
		d.append(i)
		d.append(n // i)
	i += 1
d.sort()
for i in range(len(d) - 1, -1, -1):
	ari = (1 + k) / 2 * k
	if ari <= n // d[i]:
		for j in range(1, k):
			print(j * d[i], end=' ')
		print(int(n // d[i] - ari + k) * d[i])
		exit()
print(-1)


import math

def divisorGenerator(n):
	large_divisors = []
	for i in range(1, int(math.sqrt(n) + 1)):
		if n % i == 0:
			yield i
			if i * i != n:
				large_divisors.append(n / i)
	for divisor in reversed(large_divisors):
		yield divisor
(n, k) = list(map(int, input().strip().split(' ')))
l = list(map(int, divisorGenerator(n)))
lenght = len(l) - 1
flag = True
while lenght >= 0:
	p = l[lenght]
	if p * int(n / p) == n and k <= int(n / p) - int(k * (k - 1) / 2):
		for i in range(1, k):
			print(p * i, end=' ')
		print(p * (int(n / p) - int(k * (k - 1) / 2)))
		flag = False
		break
	lenght -= 1
if flag:
	print(-1)


(n, k) = map(int, input().split())
msum = k * (k + 1) // 2
arr = []
i = 1
while i * i <= n:
	if n % i == 0:
		arr.append(i)
		arr.append(n // i)
	i += 1
arr.sort()
l = -1
r = len(arr)
while r - l > 1:
	m = (l + r) // 2
	if arr[m] * msum > n:
		r = m
	else:
		l = m
if l == -1:
	print(-1)
else:
	for i in range(1, k):
		print(arr[l] * i, end=' ')
	print(n - (k - 1) * k // 2 * arr[l])


import sys
inf = 1 << 30

def solve():
	(n, k) = map(int, input().split())
	lim = k * (k + 1) // 2
	if n < lim:
		print(-1)
		return
	d_max = 1
	for d in range(1, n + 1):
		if d * d > n:
			break
		if n % d != 0:
			continue
		q = n // d
		if d >= lim:
			d_max = q
			break
		elif q >= lim:
			d_max = d
		else:
			break
	ans = []
	j = 1
	for i in range(k - 1):
		ans.append(d_max * j)
		j += 1
	ans.append(n - sum(ans))
	print(*ans)

def __starting_point():
	solve()
__starting_point()


(n, k) = map(int, input().split())
d = 1
div = []
while d * d <= n:
	if n % d == 0:
		div.append(d)
		if d * d != n:
			div.append(n // d)
	d += 1
div.sort()
ans = None
s = k * (k + 1) // 2
for d in div:
	if n // d >= s:
		ans = d
	else:
		break
if ans:
	for i in range(1, k):
		print(i * ans, end=' ')
		n -= i * ans
	print(n)
else:
	print(-1)


def find_sol(s, k):
	if k * (k + 1) // 2 > s:
		return None
	return list(range(1, k)) + [s - (k - 1) * k // 2]

def solve():
	(n, k) = map(int, input().split())
	best_sol = None
	i = 1
	while i * i <= n:
		if n % i == 0:
			sol = find_sol(i, k)
			if sol is not None:
				print(*[x * (n // i) for x in sol])
				return
			sol = find_sol(n // i, k)
			if sol is not None:
				best_sol = [x * i for x in sol]
		i += 1
	if best_sol is not None:
		print(*best_sol)
	else:
		print(-1)
solve()


(N, K) = map(int, input().split())
if K * (K + 1) // 2 > N:
	exit(print(-1))
ans = 1
for i in range(1, int(N ** 0.5) + 1):
	if N % i:
		continue
	if ans < i:
		if K * (K + 1) // 2 <= N // i:
			ans = i
	if ans < N // i:
		if K * (K + 1) // 2 <= i:
			ans = N // i
t = N // ans
for i in range(1, K + 1):
	print(i * ans if i < K else N - (K - 1) * K // 2 * ans, end=' \n'[i == K])


import math
import bisect
(n, k) = [int(i) for i in input().split()]
mod_num = []
for i in range(1, int(math.sqrt(n)) + 1):
	if n % i == 0:
		mod_num.append(i)
		mod_num.append(n // i)
mod_num.sort()
gcd_max = 2 * n // (k * (k + 1))
if gcd_max == 0:
	print(-1)
else:
	idx = bisect.bisect_right(mod_num, gcd_max) - 1
	for i in range(1, k):
		print(mod_num[idx] * i, end=' ')
	print(n - (k - 1) * mod_num[idx] * k // 2)


(n, k) = list(map(int, input().strip().split(' ')))
M = k * (k + 1) // 2
res = 0
i = 1
while i * i <= n:
	if n % i == 0:
		rem = n // i
		if rem >= M:
			res = max(res, i)
		rem = i
		if rem >= M:
			res = max(res, n // i)
	i += 1
if res == 0:
	print(-1)
	exit()
rem = n // res
ans = [0 for j in range(k)]
for j in range(k - 1):
	ans[j] = (j + 1) * res
	rem -= j + 1
ans[-1] = rem * res
print(' '.join(list(map(str, ans))))


import sys, os
from io import BytesIO, IOBase
import collections, itertools, bisect, heapq, math, string
from decimal import *
BUFSIZE = 8192
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

def main():
	(n, k) = map(int, input().split())
	if n < k * (k + 1) // 2:
		print(-1)
		return
	mx = 0
	for i in range(1, int(math.sqrt(n)) + 1):
		if n % i == 0:
			if i >= k * (k + 1) // 2:
				mx = max(mx, n // i)
			if n // i >= k * (k + 1) // 2:
				mx = max(mx, i)
	ans = []
	for i in range(1, k):
		ans.append(i * mx)
	ans.append(n - mx * k * (k - 1) // 2)
	print(' '.join([str(x) for x in ans]))
main()


def factor(n):
	rtn = []
	p = 2
	tmp = n
	while p * p <= tmp:
		q = 0
		while tmp % p == 0:
			tmp //= p
			q += 1
		if 0 < q:
			rtn.append((p, q))
		p += 1
	if 1 < tmp:
		rtn.append((tmp, 1))
	return rtn

def divs(n):
	rtn = [1]
	arr = factor(n)
	for (p, q) in arr:
		ds = [p ** i for i in range(1, q + 1)]
		tmp = rtn[:]
		for d in ds:
			for t in tmp:
				rtn.append(d * t)
	return list(sorted(rtn))
(n, k) = map(int, input().split())
ds = divs(n)
l = 0
r = len(ds) - 1
while l + 1 < r:
	c = (l + r) // 2
	if ds[c] * k * (k + 1) // 2 <= n:
		l = c
	else:
		r = c
if l == 0 and n < k * (k + 1) // 2:
	print(-1)
else:
	d = ds[l]
	ans = [d * (i + 1) for i in range(k)]
	ans[-1] += n - sum(ans)
	print(' '.join(map(str, ans)))


import math
(N, K) = [int(x) for x in input().split()]
E = K * (K + 1) // 2
if E > N:
	print(-1)
else:
	s = 0
	mx = 0
	for x in range(1, int(math.sqrt(N)) + 2):
		if N % x == 0:
			a = x
			b = N // x
			if b >= E:
				if a > mx:
					mx = a
					s = b
			if a >= E:
				if b > mx:
					mx = b
					s = a
	for i in range(1, K):
		print(i * mx, end=' ')
	print(int(mx * (s - E + K)))


(n, k) = map(int, input().split())
minSum = k * (k + 1) // 2
if n < minSum:
	print(-1)
	exit()
elif k == 1:
	print(n)
	exit()
factors = [1]
i = 2
while i * i < n:
	if n % i == 0:
		factors.append(i)
		factors.append(n // i)
	i += 1
if i * i == n:
	factors.append(i)
factors.sort()
factors.reverse()
for gcd in factors:
	if n // gcd >= minSum:
		break
n = n // gcd
ans = [i for i in range(1, k + 1)]
ans[-1] += n - minSum
for i in range(k):
	ans[i] *= gcd
print(*ans)


import math
import sys
(n, k) = map(int, input().strip().split())
divlist = []
rev = []
for i in range(1, int(math.sqrt(n)) + 1):
	if n % i == 0:
		divlist.append(i)
		rev.append(n // i)
for i in range(len(rev)):
	divlist.append(rev[len(rev) - i - 1])
if 2 * n < k * (k + 1):
	print(-1)
else:
	beta = -1
	for i in divlist:
		if 2 * i >= k * (k + 1):
			beta = i
			break
	alpha = n // beta
	for i in range(k - 1):
		sys.stdout.write(str(alpha * (i + 1)) + ' ')
		beta -= i + 1
	print(alpha * beta)


import os
import sys
import math
(n, k) = map(int, input().split())
if k == 1:
	print(n)
else:
	j = int(math.sqrt(n))
	d = int(n / int(k * (k + 1) / 2))
	if d == 0:
		print(-1)
	else:
		r = 1
		for x in range(1, j + 1):
			if n % x != 0:
				continue
			if x <= d and x > r:
				r = int(x)
			if int(n / x) <= d and int(n / x) > r:
				r = int(n / x)
		for x in range(1, k):
			print(int(r * x), end=' ')
		n -= int(r * k * (k - 1) / 2)
		print(n)


(n, k) = input().split()
n = int(n)
k = int(k)
divisors = []

def divs(p):
	i = 1
	while i * i <= p:
		if n % i == 0:
			divisors.append(int(i))
			if i * i != n:
				divisors.append(int(n / i))
		i += 1
divs(n)
res = -1
divisors.sort()
for x in divisors:
	s = k * (k - 1) / 2 * x
	if n - s > (k - 1) * x:
		res = x
if res == -1:
	print(-1)
else:
	for i in range(1, k):
		print(int(res * i))
	print(int(n - res * (k * (k - 1)) / 2))


import sys
line = sys.stdin.readline()
line.strip()
comp = line.split(' ')
n = int(comp[0])
k = int(comp[1])
if k * (k + 1) // 2 > n:
	print('-1')
	exit(0)
divs = []
d = 1
while d * d <= n:
	if n % d == 0:
		divs.append(d)
		divs.append(n // d)
	d += 1
maxDiv = 0
for dv in divs:
	if (k + 1) * k // 2 <= dv:
		maxDiv = max(maxDiv, n // dv)
	if (k + 1) * k // 2 <= n // dv:
		maxDiv = max(maxDiv, dv)
arr = [maxDiv * x for x in range(1, k)] + [n - k * (k - 1) // 2 * maxDiv]
print(' '.join(map(str, arr)))


import os
import sys
from io import BytesIO, IOBase
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
from bisect import bisect_left
from collections import Counter
import math
f = []
(n, k) = map(int, input().split())
if k * (k + 1) // 2 > n:
	print(-1)
	exit()
i = 1
while i <= int(math.sqrt(n)) + 1:
	if n % i == 0:
		if n / i == i:
			f.append(i)
		else:
			f.append(i)
			f.append(n // i)
	i += 1
f.sort()
f = f[::-1]
for i in f:
	if i * k * (k + 1) // 2 <= n:
		ans = i
		break
cnt = 1
c = []
for i in range(k):
	if i == k - 1:
		c.append(n - sum(c))
	else:
		c.append(ans * cnt)
	cnt += 1
print(*c)


from math import sqrt
(n, k) = (int(i) for i in input().split())

def Provera(n, k):
	if k * (k + 1) // 2 > n:
		return True
if Provera(n, k):
	print(-1)
	return
for i in range(2, int(sqrt(n)) + 1):
	if n % i == 0:
		NZD = n // i
		if not Provera(i, k):
			if k * (k + 1) // 2 == i:
				for j in range(1, k + 1):
					print(NZD * j, end=' ')
				return
			if k * (k + 1) // 2 < i:
				for j in range(1, k):
					print(NZD * j, end=' ')
				print(n - NZD * (k * (k - 1) // 2))
				return
for i in range(int(sqrt(n)) + 1, 0, -1):
	if n % i == 0:
		if not Provera(n // i, k):
			if k * (k + 1) // 2 == n // i:
				for j in range(1, k + 1):
					print(i * j, end=' ')
				return
			if k * (k + 1) // 2 < n // i:
				for j in range(1, k):
					print(i * j, end=' ')
				print(n - i * (k * (k - 1) // 2))
				return
if k * (k + 1) // 2 == n:
	for i in range(1, k + 1):
		print(i, end=' ')
else:
	for i in range(1, k):
		print(i, end=' ')
	print(n - k * (k - 1) // 2)


import sys, math
input = sys.stdin.readline

def getSum(k):
	return k * (k - 1) // 2

def HalfDead():
	(n, k) = map(int, input().split())
	ans = -1
	for i in range(1, int(math.sqrt(n)) + 1):
		if not n % i:
			x = i
			y = n // i
			sum = x * getSum(k)
			rem = n - sum
			if rem > x * (k - 1):
				if x > ans:
					ans = x
			sum = y * getSum(k)
			rem = n - sum
			if rem > y * (k - 1):
				if y > ans:
					ans = y
	if ans == -1:
		print(ans)
	else:
		ar = []
		for i in range(1, k):
			ar.append(ans * i)
		ar.append(n - ans * getSum(k))
		print(*ar)
HalfDead()


def chk(d):
	s = d * (k - 1) * k // 2
	if n - s > (k - 1) * d:
		if (n - s) % d == 0:
			return True
	return False
(n, k) = map(int, input().split())
nod = -1
d = 1
while d * d <= n:
	if chk(d):
		nod = max(nod, d)
	if chk(n // d):
		nod = max(nod, n // d)
	d += 1
ans = ''
if nod > -1:
	for i in range(1, k):
		ans += str(nod * i) + ' '
	print(ans + str(n - nod * (k - 1) * k // 2))
else:
	print(-1)


def main():
	from math import sqrt
	(n, k) = list(map(int, input().split()))
	(g, x) = (n * 2 // ((k + 1) * k), n)
	if not g:
		print(-1)
		return
	divisors = [1]
	p = q = 1
	while not x % 2:
		x //= 2
		q *= 2
		divisors.append(q)
	while True:
		lim = int(sqrt(x))
		if p >= lim:
			break
		for p in range(p + 2, lim + 2, 2):
			if not x % p:
				(l, q) = ([], 1)
				while not x % p:
					x //= p
					q *= p
					l.append(q)
				divisors += [p * q for p in l for q in divisors]
				break
		else:
			break
	if x != 1:
		divisors += [x * q for q in divisors]
	g = max((p for p in divisors if p <= g))
	print(' '.join(map(str, list(range(g, g * k, g)))), n - g * (k - 1) * k // 2)

def __starting_point():
	main()
__starting_point()


(n, k) = map(int, input().split())
if 2 * n < k * (k + 1):
	print(-1)
	exit(0)
mx = 0

def ok(d):
	sm = k * (k - 1) // 2
	sm *= d
	if sm + k > n:
		return False
	if n - sm > (k - 1) * d:
		return True
	else:
		return False
i = 1
while i * i <= n:
	if n % i == 0:
		if ok(i):
			mx = max(mx, i)
		if ok(n // i):
			mx = max(mx, n // i)
	i += 1
ans = ''
for i in range(1, k):
	ans += str(i * mx) + ' '
ans += str(n - k * (k - 1) // 2 * mx)
print(ans)


from math import sqrt
(n, k) = map(int, input().split())
max_d = 0
for d in range(1, int(sqrt(n) + 2)):
	if n % d != 0:
		continue
	if d * k * (k + 1) // 2 <= n:
		max_d = max(max_d, d)
	if n // d * k * (k + 1) // 2 <= n:
		max_d = max(max_d, n // d)
if max_d == 0:
	print(-1)
	exit(0)
for i in range(k - 1):
	print((i + 1) * max_d, end=' ')
	n -= (i + 1) * max_d
print(n)


import math
import random
import heapq, bisect
import sys
from collections import deque, defaultdict
from fractions import Fraction
import sys
import threading
from collections import defaultdict
threading.stack_size(10 ** 8)
mod = 10 ** 9 + 7
mod1 = 998244353
import os
import sys
from io import BytesIO, IOBase
sys.setrecursionlimit(300000)
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

class TreeNode:

	def __init__(self, k, v):
		self.key = k
		self.value = v
		self.left = None
		self.right = None
		self.parent = None
		self.height = 1
		self.num_left = 1
		self.num_total = 1

class AvlTree:

	def __init__(self):
		self._tree = None

	def add(self, k, v):
		if not self._tree:
			self._tree = TreeNode(k, v)
			return
		node = self._add(k, v)
		if node:
			self._rebalance(node)

	def _add(self, k, v):
		node = self._tree
		while node:
			if k < node.key:
				if node.left:
					node = node.left
				else:
					node.left = TreeNode(k, v)
					node.left.parent = node
					return node.left
			elif node.key < k:
				if node.right:
					node = node.right
				else:
					node.right = TreeNode(k, v)
					node.right.parent = node
					return node.right
			else:
				node.value = v
				return

	@staticmethod
	def get_height(x):
		return x.height if x else 0

	@staticmethod
	def get_num_total(x):
		return x.num_total if x else 0

	def _rebalance(self, node):
		n = node
		while n:
			lh = self.get_height(n.left)
			rh = self.get_height(n.right)
			n.height = max(lh, rh) + 1
			balance_factor = lh - rh
			n.num_total = 1 + self.get_num_total(n.left) + self.get_num_total(n.right)
			n.num_left = 1 + self.get_num_total(n.left)
			if balance_factor > 1:
				if self.get_height(n.left.left) < self.get_height(n.left.right):
					self._rotate_left(n.left)
				self._rotate_right(n)
			elif balance_factor < -1:
				if self.get_height(n.right.right) < self.get_height(n.right.left):
					self._rotate_right(n.right)
				self._rotate_left(n)
			else:
				n = n.parent

	def _remove_one(self, node):
		replacement = node.left or node.right
		if node.parent:
			if AvlTree._is_left(node):
				node.parent.left = replacement
			else:
				node.parent.right = replacement
			replacement.parent = node.parent
			node.parent = None
		else:
			self._tree = replacement
			replacement.parent = None
		node.left = None
		node.right = None
		node.parent = None
		self._rebalance(replacement)

	def _remove_leaf(self, node):
		if node.parent:
			if AvlTree._is_left(node):
				node.parent.left = None
			else:
				node.parent.right = None
			self._rebalance(node.parent)
		else:
			self._tree = None
		node.parent = None
		node.left = None
		node.right = None

	def remove(self, k):
		node = self._get_node(k)
		if not node:
			return
		if AvlTree._is_leaf(node):
			self._remove_leaf(node)
			return
		if node.left and node.right:
			nxt = AvlTree._get_next(node)
			node.key = nxt.key
			node.value = nxt.value
			if self._is_leaf(nxt):
				self._remove_leaf(nxt)
			else:
				self._remove_one(nxt)
			self._rebalance(node)
		else:
			self._remove_one(node)

	def get(self, k):
		node = self._get_node(k)
		return node.value if node else -1

	def _get_node(self, k):
		if not self._tree:
			return None
		node = self._tree
		while node:
			if k < node.key:
				node = node.left
			elif node.key < k:
				node = node.right
			else:
				return node
		return None

	def get_at(self, pos):
		x = pos + 1
		node = self._tree
		while node:
			if x < node.num_left:
				node = node.left
			elif node.num_left < x:
				x -= node.num_left
				node = node.right
			else:
				return (node.key, node.value)
		raise IndexError('Out of ranges')

	@staticmethod
	def _is_left(node):
		return node.parent.left and node.parent.left == node

	@staticmethod
	def _is_leaf(node):
		return node.left is None and node.right is None

	def _rotate_right(self, node):
		if not node.parent:
			self._tree = node.left
			node.left.parent = None
		elif AvlTree._is_left(node):
			node.parent.left = node.left
			node.left.parent = node.parent
		else:
			node.parent.right = node.left
			node.left.parent = node.parent
		bk = node.left.right
		node.left.right = node
		node.parent = node.left
		node.left = bk
		if bk:
			bk.parent = node
		node.height = max(self.get_height(node.left), self.get_height(node.right)) + 1
		node.num_total = 1 + self.get_num_total(node.left) + self.get_num_total(node.right)
		node.num_left = 1 + self.get_num_total(node.left)

	def _rotate_left(self, node):
		if not node.parent:
			self._tree = node.right
			node.right.parent = None
		elif AvlTree._is_left(node):
			node.parent.left = node.right
			node.right.parent = node.parent
		else:
			node.parent.right = node.right
			node.right.parent = node.parent
		bk = node.right.left
		node.right.left = node
		node.parent = node.right
		node.right = bk
		if bk:
			bk.parent = node
		node.height = max(self.get_height(node.left), self.get_height(node.right)) + 1
		node.num_total = 1 + self.get_num_total(node.left) + self.get_num_total(node.right)
		node.num_left = 1 + self.get_num_total(node.left)

	@staticmethod
	def _get_next(node):
		if not node.right:
			return node.parent
		n = node.right
		while n.left:
			n = n.left
		return n

class SegmentTree1:

	def __init__(self, data, default=2 ** 51, func=lambda a, b: a & b):
		self._default = default
		self._func = func
		self._len = len(data)
		self._size = _size = 1 << (self._len - 1).bit_length()
		self.data = [default] * (2 * _size)
		self.data[_size:_size + self._len] = data
		for i in reversed(range(_size)):
			self.data[i] = func(self.data[i + i], self.data[i + i + 1])

	def __delitem__(self, idx):
		self[idx] = self._default

	def __getitem__(self, idx):
		return self.data[idx + self._size]

	def __setitem__(self, idx, value):
		idx += self._size
		self.data[idx] = value
		idx >>= 1
		while idx:
			self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
			idx >>= 1

	def __len__(self):
		return self._len

	def query(self, start, stop):
		if start == stop:
			return self.__getitem__(start)
		stop += 1
		start += self._size
		stop += self._size
		res = self._default
		while start < stop:
			if start & 1:
				res = self._func(res, self.data[start])
				start += 1
			if stop & 1:
				stop -= 1
				res = self._func(res, self.data[stop])
			start >>= 1
			stop >>= 1
		return res

	def __repr__(self):
		return 'SegmentTree({0})'.format(self.data)

class SegmentTree:

	def __init__(self, data, default=0, func=lambda a, b: max(a, b)):
		self._default = default
		self._func = func
		self._len = len(data)
		self._size = _size = 1 << (self._len - 1).bit_length()
		self.data = [default] * (2 * _size)
		self.data[_size:_size + self._len] = data
		for i in reversed(range(_size)):
			self.data[i] = func(self.data[i + i], self.data[i + i + 1])

	def __delitem__(self, idx):
		self[idx] = self._default

	def __getitem__(self, idx):
		return self.data[idx + self._size]

	def __setitem__(self, idx, value):
		idx += self._size
		self.data[idx] = value
		idx >>= 1
		while idx:
			self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
			idx >>= 1

	def __len__(self):
		return self._len

	def query(self, start, stop):
		if start == stop:
			return self.__getitem__(start)
		stop += 1
		start += self._size
		stop += self._size
		res = self._default
		while start < stop:
			if start & 1:
				res = self._func(res, self.data[start])
				start += 1
			if stop & 1:
				stop -= 1
				res = self._func(res, self.data[stop])
			start >>= 1
			stop >>= 1
		return res

	def __repr__(self):
		return 'SegmentTree({0})'.format(self.data)

class Factorial:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorials = [1, 1]
		self.invModulos = [0, 1]
		self.invFactorial_ = [1, 1]

	def calc(self, n):
		if n <= -1:
			print('Invalid argument to calculate n!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.factorials):
			return self.factorials[n]
		nextArr = [0] * (n + 1 - len(self.factorials))
		initialI = len(self.factorials)
		prev = self.factorials[-1]
		m = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * i % m
		self.factorials += nextArr
		return self.factorials[n]

	def inv(self, n):
		if n <= -1:
			print('Invalid argument to calculate n^(-1)')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		p = self.MOD
		pi = n % p
		if pi < len(self.invModulos):
			return self.invModulos[pi]
		nextArr = [0] * (n + 1 - len(self.invModulos))
		initialI = len(self.invModulos)
		for i in range(initialI, min(p, n + 1)):
			next = -self.invModulos[p % i] * (p // i) % p
			self.invModulos.append(next)
		return self.invModulos[pi]

	def invFactorial(self, n):
		if n <= -1:
			print('Invalid argument to calculate (n^(-1))!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.invFactorial_):
			return self.invFactorial_[n]
		self.inv(n)
		nextArr = [0] * (n + 1 - len(self.invFactorial_))
		initialI = len(self.invFactorial_)
		prev = self.invFactorial_[-1]
		p = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * self.invModulos[i % p] % p
		self.invFactorial_ += nextArr
		return self.invFactorial_[n]

class Combination:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorial = Factorial(MOD)

	def ncr(self, n, k):
		if k < 0 or n < k:
			return 0
		k = min(k, n - k)
		f = self.factorial
		return f.calc(n) * f.invFactorial(max(n - k, k)) * f.invFactorial(min(k, n - k)) % self.MOD

def powm(a, n, m):
	if a == 1 or n == 0:
		return 1
	if n % 2 == 0:
		s = powm(a, n // 2, m)
		return s * s % m
	else:
		return a * powm(a, n - 1, m) % m

def sort_list(list1, list2):
	zipped_pairs = zip(list2, list1)
	z = [x for (_, x) in sorted(zipped_pairs)]
	return z

def product(l):
	por = 1
	for i in range(len(l)):
		por *= l[i]
	return por

def binarySearchCount(arr, n, key):
	left = 0
	right = n - 1
	count = 0
	while left <= right:
		mid = int((right + left) / 2)
		if arr[mid] < key:
			count = mid + 1
			left = mid + 1
		else:
			right = mid - 1
	return count

def countdig(n):
	c = 0
	while n > 0:
		n //= 10
		c += 1
	return c

def binary(x, length):
	y = bin(x)[2:]
	return y if len(y) >= length else '0' * (length - len(y)) + y

def countGreater(arr, n, k):
	l = 0
	r = n - 1
	leftGreater = n
	while l <= r:
		m = int(l + (r - l) / 2)
		if arr[m] >= k:
			leftGreater = m
			r = m - 1
		else:
			l = m + 1
	return n - leftGreater
(n, k) = map(int, input().split())
if n < k * (k + 1) // 2:
	print(-1)
	sys.exit(0)
s = set()
s.add(1)
s.add(n)
for i in range(2, int(math.sqrt(n)) + 1):
	if n % i == 0:
		s.add(i)
		s.add(n // i)
s = sorted(s)
tr = k * (k + 1)
tr //= 2
b = binarySearchCount(s, len(s), tr)
su = s[b]
gcd = n // s[b]
ans = [i * gcd for i in range(1, k + 1)]
ans[-1] += n - sum(ans)
print(*ans)


import os
import sys
import math
from io import BytesIO, IOBase
from fractions import Fraction
import collections
from itertools import permutations
from collections import defaultdict
from collections import deque
import threading
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')

class SegmentTree:

	def __init__(self, data, default=-10 ** 6, func=lambda a, b: max(a, b)):
		self._default = default
		self._func = func
		self._len = len(data)
		self._size = _size = 1 << (self._len - 1).bit_length()
		self.data = [default] * (2 * _size)
		self.data[_size:_size + self._len] = data
		for i in reversed(range(_size)):
			self.data[i] = func(self.data[i + i], self.data[i + i + 1])

	def __delitem__(self, idx):
		self[idx] = self._default

	def __getitem__(self, idx):
		return self.data[idx + self._size]

	def __setitem__(self, idx, value):
		idx += self._size
		self.data[idx] = value
		idx >>= 1
		while idx:
			self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
			idx >>= 1

	def __len__(self):
		return self._len

	def query(self, start, stop):
		if start == stop:
			return self.__getitem__(start)
		stop += 1
		start += self._size
		stop += self._size
		res = self._default
		while start < stop:
			if start & 1:
				res = self._func(res, self.data[start])
				start += 1
			if stop & 1:
				stop -= 1
				res = self._func(res, self.data[stop])
			start >>= 1
			stop >>= 1
		return res

	def __repr__(self):
		return 'SegmentTree({0})'.format(self.data)

class SegmentTree1:

	def __init__(self, data, default=10 ** 6, func=lambda a, b: min(a, b)):
		self._default = default
		self._func = func
		self._len = len(data)
		self._size = _size = 1 << (self._len - 1).bit_length()
		self.data = [default] * (2 * _size)
		self.data[_size:_size + self._len] = data
		for i in reversed(range(_size)):
			self.data[i] = func(self.data[i + i], self.data[i + i + 1])

	def __delitem__(self, idx):
		self[idx] = self._default

	def __getitem__(self, idx):
		return self.data[idx + self._size]

	def __setitem__(self, idx, value):
		idx += self._size
		self.data[idx] = value
		idx >>= 1
		while idx:
			self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
			idx >>= 1

	def __len__(self):
		return self._len

	def query(self, start, stop):
		if start == stop:
			return self.__getitem__(start)
		stop += 1
		start += self._size
		stop += self._size
		res = self._default
		while start < stop:
			if start & 1:
				res = self._func(res, self.data[start])
				start += 1
			if stop & 1:
				stop -= 1
				res = self._func(res, self.data[stop])
			start >>= 1
			stop >>= 1
		return res

	def __repr__(self):
		return 'SegmentTree({0})'.format(self.data)
MOD = 10 ** 9 + 7

class Factorial:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorials = [1, 1]
		self.invModulos = [0, 1]
		self.invFactorial_ = [1, 1]

	def calc(self, n):
		if n <= -1:
			print('Invalid argument to calculate n!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.factorials):
			return self.factorials[n]
		nextArr = [0] * (n + 1 - len(self.factorials))
		initialI = len(self.factorials)
		prev = self.factorials[-1]
		m = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * i % m
		self.factorials += nextArr
		return self.factorials[n]

	def inv(self, n):
		if n <= -1:
			print('Invalid argument to calculate n^(-1)')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		p = self.MOD
		pi = n % p
		if pi < len(self.invModulos):
			return self.invModulos[pi]
		nextArr = [0] * (n + 1 - len(self.invModulos))
		initialI = len(self.invModulos)
		for i in range(initialI, min(p, n + 1)):
			next = -self.invModulos[p % i] * (p // i) % p
			self.invModulos.append(next)
		return self.invModulos[pi]

	def invFactorial(self, n):
		if n <= -1:
			print('Invalid argument to calculate (n^(-1))!')
			print('n must be non-negative value. But the argument was ' + str(n))
			exit()
		if n < len(self.invFactorial_):
			return self.invFactorial_[n]
		self.inv(n)
		nextArr = [0] * (n + 1 - len(self.invFactorial_))
		initialI = len(self.invFactorial_)
		prev = self.invFactorial_[-1]
		p = self.MOD
		for i in range(initialI, n + 1):
			prev = nextArr[i - initialI] = prev * self.invModulos[i % p] % p
		self.invFactorial_ += nextArr
		return self.invFactorial_[n]

class Combination:

	def __init__(self, MOD):
		self.MOD = MOD
		self.factorial = Factorial(MOD)

	def ncr(self, n, k):
		if k < 0 or n < k:
			return 0
		k = min(k, n - k)
		f = self.factorial
		return f.calc(n) * f.invFactorial(max(n - k, k)) * f.invFactorial(min(k, n - k)) % self.MOD
mod = 10 ** 9 + 7
omod = 998244353
prime = [True for i in range(200001)]
pp = [0] * 200001

def SieveOfEratosthenes(n=200000):
	p = 2
	while p * p <= n:
		if prime[p] == True:
			for i in range(p * p, n + 1, p):
				prime[i] = False
		p += 1
(n, k) = map(int, input().split())
if n < k * (k + 1) // 2:
	print(-1)
else:
	drd = 1
	for d in range(1, int(n ** 0.5) + 1):
		if n % d == 0:
			x = n // d
			if x >= k * (k + 1) // 2:
				drd = max(d, drd)
			if d >= k * (k + 1) // 2:
				drd = max(n // d, drd)
	ans = []
	x = n // drd
	x -= k * (k - 1) // 2
	for i in range(1, k):
		ans.append(i * drd)
	ans.append(x * drd)
	print(*ans)


import math
s = input().split()
n = int(s[0])
k = int(s[1])
div = []
for j in range(math.trunc(math.sqrt(n))):
	i = j + 1
	if n % i == 0:
		div.append(n // i)
		div.append(i)
div.sort()
div.reverse()
u = 0
for q in div:
	if n / q >= k / 2 + k * k / 2:
		u = q
		break
if u == 0:
	print(-1)
else:
	for i in range(1, k):
		print(i * u)
		n -= i * u
	print(n)


(n, k) = map(int, input().split())
kk = k
k = k * (k + 1) // 2
an = -1
if k <= n:
	for i in range(1, int(n ** 0.5 + 2)):
		if n % i == 0:
			if k <= n // i:
				an = max(an, i)
			if k <= i:
				an = max(an, n // i)
if an != -1:
	a = an
	x = []
	for _ in range(kk - 1):
		x.append(a)
		n -= a
		a += an
	x.append(n)
	print(*x)
else:
	print(an)


from math import sqrt

def factors(n, k):
	i = 2
	p = k * (k - 1) // 2
	s = 0
	while i <= sqrt(n):
		if n % i == 0:
			if n // i - p > k - 1:
				s = max(s, i)
			if i - p > k - 1:
				s = max(s, n // i)
		i += 1
	if s == 0:
		return 1
	return s

def solve(n, k):
	ans = []
	p = 2 * n / (k * (k + 1))
	if p < 1 or k >= n:
		return [-1]
	if p % 1 == 0:
		return [x * int(p) for x in range(1, k + 1)]
	m = factors(n, k)
	return [x * m for x in range(1, k)] + [n - m * k * (k - 1) // 2]
(n, k) = map(int, input().split())
if k == 1:
	print(n)
else:
	print(*solve(n, k))


from math import sqrt
(n, k) = map(int, input().split())
d = 10000000000000
if n < k * (k + 1) // 2:
	print(-1)
else:
	for i in range(1, int(sqrt(n)) + 1):
		if n % i == 0:
			if i >= k * (k + 1) // 2:
				d = i
				break
			if n // i >= k * (k + 1) // 2:
				d = min(d, n // i)
	for i in range(1, k):
		print(i * n // d, end=' ')
	print(n // d * (k + d - k * (k + 1) // 2), end=' ')


import math, sys, bisect, heapq
from collections import defaultdict, Counter, deque
from itertools import groupby, accumulate
int1 = lambda x: int(x) - 1

def input():
	return sys.stdin.readline().strip()
ilele = lambda : map(int, input().split())
alele = lambda : list(map(int, input().split()))
ilelec = lambda : map(int1, input().split())
alelec = lambda : list(map(int1, input().split()))

def list2d(a, b, c):
	return [[c] * b for i in range(a)]

def list3d(a, b, c, d):
	return [[[d] * c for j in range(b)] for i in range(a)]

def Y(c):
	print(['NO', 'YES'][c])

def y(c):
	print(['no', 'yes'][c])

def Yy(c):
	print(['No', 'Yes'][c])
(n, k) = ilele()
ans = -1
if k == 1:
	print(n)
	exit(0)
s = 1
v = k * (k - 1) // 2
div = set([1, n])
m = n
for i in range(2, int(n ** 0.5) + 1):
	if m % i == 0:
		div.add(i)
		div.add(m // i)
div = sorted(list(div))
for s in div:
	frst = s * v
	rem = n - frst
	if rem <= s * (k - 1):
		break
	if rem % s == 0:
		ans = s
if ans == -1:
	print(ans)
else:
	l = 0
	c = 0
	for i in range(k - 1):
		l += ans
		c += l
		print(l, end=' ')
	print(n - c)


(n, k) = map(int, input().split())
d = k * k + k >> 1
(s, m) = (1, n // d)
if n < d:
	print(-1)
	exit()
for q in range(2, 100001):
	if n % q == 0:
		if s < q <= m:
			s = q
		if s < n // q <= m:
			s = n // q
for q in list(range(s, s * k, s)) + [n - (d - k) * s]:
	print(q)


import math
(n, k) = [int(x) for x in input().split()]
if k * (k + 1) // 2 > n:
	print(-1)
else:
	b = k * (k + 1) // 2
	f = []
	f2 = []
	for x in range(1, int(math.ceil(n ** 0.5)) + 1):
		if n % x == 0:
			f.append(x)
			f2.append(n // x)
	f += f2[::-1]
	low = 0
	high = len(f) - 1
	while low <= high:
		mid = (low + high) // 2
		if f[mid] * b <= n:
			low = mid + 1
		else:
			high = mid - 1
	cool = f[high]
	l = [x * cool for x in range(1, k + 1)]
	l[-1] += n - cool * b
	print(' '.join([str(x) for x in l]))


import math
(n, k) = map(int, input().split())
Ans = []
if n < (k + 1) * k // 2:
	print(-1)
else:
	d = n
	nd = 1
	for i in range(int(math.sqrt(n)), 1, -1):
		if n % i == 0:
			if i > nd and n // i >= (k + 1) * k // 2:
				nd = i
			if n // i > nd and i >= (k + 1) * k // 2:
				nd = n // i
	d = n // nd
	for x in range(1, k):
		Ans.append(nd * x)
		d -= x
	Ans.append(d * nd)
	if len(Ans) != 0:
		print(*Ans)
	else:
		print(-1)


import math

def res():
	d = 0
	s = 0
	(n, k) = input().split()
	n = int(n)
	k = int(k)
	N = n
	if n == 1 and k == 1:
		print(1)
		return
	for i in range(1, int(math.sqrt(int(N))) + 1):
		if n % i == 0:
			d1 = i
			d2 = n / i
			s1 = k * (k - 1) * d1 / 2
			s2 = k * (k - 1) * d2 / 2
			if n - s1 > (k - 1) * d1 and d < d1:
				d = d1
				s = s1
			if n - s2 > (k - 1) * d2 and d < d2:
				d = d2
				s = s2
	if d == 0:
		print(-1)
		return
	for i in range(1, k):
		print(int(d * i), end=' ')
	print(int(n - s))
res()


str_params = input()
[n, k] = [int(s) for s in str_params.split(' ')]
parts = (1 + k) / 2 * k
if parts <= n:
	nod = n / parts
	while (nod % 1 != 0) | (parts % 1 != 0):
		if nod < parts:
			if nod % 1 != 0:
				nod = int(nod)
			else:
				nod = nod - 1
			parts = n / nod
		else:
			if parts % 1 != 0:
				parts = int(parts) + 1
			else:
				parts = parts + 1
			nod = n / parts
	numbers = [nod * (x + 1) for x in range(k)]
	numbers[k - 1] = n - (1 + k - 1) / 2 * (k - 1) * nod
	if numbers[0] == 0:
		print(-1)
	else:
		print(' '.join(map(str, list(map(int, numbers)))))
else:
	print(-1)


import math

def do():
	(n, k) = map(int, input().split(' '))
	gcd = -1
	for i in range(1, int(math.sqrt(n)) + 1):
		if n % i == 0:
			cp = n // i
			if i * k * (k + 1) // 2 <= n:
				gcd = max(gcd, i)
			if cp * k * (k + 1) // 2 <= n:
				gcd = max(gcd, cp)
	if gcd == -1:
		print('-1')
	else:
		res = [gcd * i for i in range(1, k)]
		pre = sum(res) if res else 0
		res.append(n - pre)
		print(' '.join(map(str, res)))
do()


def ma():
	s = input()
	nums = s.split(' ')
	n = int(nums[0])
	k = int(nums[1])
	base = k * (k + 1) // 2
	if n < base:
		print(-1)
		return
	m = n // base
	if m * m <= n:
		while n % m != 0:
			m -= 1
	else:
		p = (n - 1) // m + 1
		while p * p <= n and n % p != 0:
			p += 1
		if n % p == 0:
			m = n // p
		else:
			q = (n - 1) // m
			while n % q != 0:
				q -= 1
			m = q
	for i in range(k - 1):
		print(str((i + 1) * m), end='')
		print(' ', end='')
	print(n - k * (k - 1) // 2 * m)
ma()


(n, k) = input().split()
n = int(n)
k = int(k)
ag = 0

def solve(g):
	ni = n / g
	tp = k * (k - 1) / 2
	if ni - tp > k - 1:
		return True
	return False
i = 1
while i * i <= n:
	if n % i == 0:
		if solve(i) == True:
			ag = max(ag, i)
		if solve(n / i) == True:
			ag = max(ag, n / i)
	i += 1
if ag == 0:
	print(-1)
else:
	for i in range(1, k):
		print(int(i * ag), end=' ')
	tp = (k - 1) * k / 2
	j = n / ag - tp
	j *= ag
	j = int(j)
	print(int(j))


from itertools import chain
from itertools import combinations
from functools import reduce
data = input()
ss = int(data.split(' ')[0])
nn = int(data.split(' ')[1])
base = (nn ** 2 + nn) / 2
result = []
lss = 0
i = int(ss / base)
if i == 0:
	print(-1)
elif i != 0 and ss % base == 0:
	for x in range(1, nn):
		result.append(str(i * x))
		lss += i * x
	result.append(str(ss - lss))
	print(' '.join(result))
else:

	def primefactors(n):
		f = 2
		while f * f <= n:
			while n % f == 0:
				yield f
				n //= f
			f += 1
		if n > 1:
			yield n
	prime = list(primefactors(ss))

	def powerset(iterable):
		primeall = sorted(list(set(list(chain.from_iterable((combinations(prime, r) for r in range(len(prime) + 1)))))))
		del primeall[0]
		primenew = []
		for i in primeall:
			i = list(i)
			primenew.append(reduce(lambda x, y: x * y, i))
		primenew = list(set(primenew))
		primenew.sort(reverse=True)
		lss = 0
		for x in primenew:
			if ss % x == 0 and x * base <= ss:
				result = [str(x * y) for y in range(1, nn)]
				for i in result:
					lss += int(i)
				break
		if lss == 0:
			result = [str(y) for y in range(1, nn)]
			for z in result:
				lss += int(z)
		result.append(str(int(ss - lss)))
		print(' '.join(result))
	powerset(prime)


(n, k) = map(int, input().split())
maximal_gcd = -1
for i in range(1, n + 1):
	if i * i > n:
		break
	if n % i == 0:
		quoi = n // i
		if quoi >= k * (k + 1) // 2 and maximal_gcd < i:
			maximal_gcd = i
		sec_quoi = i
		if sec_quoi >= k * (k + 1) // 2 and maximal_gcd < n // i:
			maximal_gcd = n // i
if maximal_gcd < 0:
	print(-1)
	exit()
else:
	quoi = n // maximal_gcd - k * (k + 1) // 2
	ans = [maximal_gcd * j for j in range(1, k + 1)]
	ans[-1] += quoi * maximal_gcd
	assert sum(ans) == n
	print(*ans)
	exit()


(n, k) = map(int, input().split())
ans = 0
for i in range(1, round(n ** 0.5) + 2):
	if n % i == 0:
		if k * (k - 1) // 2 * i < n and n - k * (k - 1) // 2 * i > 0 and (n - k * (k - 1) // 2 * i > (k - 1) * i):
			ans = max(ans, i)
		i = n // i
		if k * (k - 1) // 2 * i < n and n - k * (k - 1) // 2 * i > 0 and (n - k * (k - 1) // 2 * i > (k - 1) * i):
			ans = max(ans, i)
			i = n // i
if k * (k + 1) // 2 > n:
	print(-1)
else:
	print(' '.join([str(ans * i) for i in range(1, k)] + [str(n - k * (k - 1) // 2 * ans)]))


def divisors(x):
	divisor = []
	for i in range(1, int(x ** (1 / 2) + 1)):
		if x % i == 0:
			divisor.append(i)
			if i != x // i:
				divisor.append(x // i)
	return divisor
(n, k) = [int(x) for x in input().split()]
factors = sorted(divisors(n))
maxfactor = 0
for i in factors:
	if i * (k * (k + 1) // 2) <= n:
		maxfactor = i
if maxfactor:
	tobeprinted = [maxfactor * i for i in range(1, k + 1)]
	tobeprinted[-1] += n - sum(tobeprinted)
	print(*tobeprinted)
else:
	print(-1)


(n, k) = map(int, input().split(' '))
if n < k * (k + 1) // 2:
	print(-1)
	exit(0)
(i, tot) = (1, k * (k + 1) // 2)
fuck = 0
while i * i <= n:
	if n % i == 0:
		if i >= tot:
			fuck = n // i
			break
		elif n // i >= tot:
			fuck = i
	i += 1
if fuck == 0:
	print(-1)
	exit(0)
sum = 0
for i in range(1, k):
	print(i * fuck, end=' ')
	sum += i * fuck
print(n - sum)


def check(x):
	if x >= k * (k + 1) // 2:
		return True
	return False
(n, k) = map(int, input().split())
i = 1
g = 0
while i * i <= n:
	if n % i == 0:
		if i == n // i:
			if check(n // i):
				g = max(g, i)
		else:
			if check(n // i):
				g = max(g, i)
			if check(i):
				g = max(g, n // i)
	i += 1
if g == 0:
	print(-1)
else:
	print(*map(lambda x: x * g, range(1, k)), (n // g - k * (k - 1) // 2) * g)


import sys
input = sys.stdin.readline
(n, k) = map(int, input().split())
l = set()
for i in range(1, int(n ** 0.5) + 1):
	if n % i == 0:
		l.add(i)
		l.add(n // i)
l = list(l)
l.sort()
ans = []
for x in l:
	nn = n // x
	if nn < k * (k + 1) // 2:
		continue
	mm = (k * k - k + 2 * nn) // (2 * k)
	m = -1
	for j in range(mm - 5, mm + 6):
		if j - k >= 1 and j * (j + 1) // 2 - (j - k) * (j - k + 1) // 2 > nn:
			m = j
			break
	m -= 1
	r = nn - m * (m + 1) // 2 + (m - k) * (m - k + 1) // 2
	ans = [i for i in range(m - k + 1, m)] + [m + r]
	for i in range(k):
		ans[i] *= x
if ans:
	print(*ans)
else:
	print(-1)


[n, k] = [int(x) for x in input().split()]
m = k * (k + 1) / 2
limit = n // m
lul = '-1'

def nice(x):
	global lul
	lul = ''
	sum = 0
	a = [0] * k
	for i in range(1, k):
		a[i - 1] = str(i * x)
		sum += i * x
	a[k - 1] = str(n - sum)
	print(' '.join(a))
pep = -1
for i in range(1, 1000000):
	if i * i > n:
		break
	if i > limit:
		break
	if n % i > 0:
		continue
	if n // i <= limit:
		nice(n // i)
		break
	pep = i
if lul == '-1' and pep != -1:
	nice(pep)
print(lul)


def gaus(n):
	return int((1 + n) * n / 2)

def divisores(n):
	resposta = []
	i = 1
	while i ** 2 < n:
		if n % i == 0:
			resposta.append(i)
			resposta.append(n // i)
		i += 1
	if i ** 2 == n:
		resposta.append(i)
	return resposta

def div(vetor, valor):
	vetor.sort()
	for e in vetor:
		if e >= valor:
			return e
(n, qtd) = input().split(' ')
n = int(n)
qtd = int(qtd)
if n < gaus(qtd):
	print(-1)
else:
	my_soma_total = div(divisores(n), gaus(qtd))
	saida = [i for i in range(1, qtd + 1)]
	diferenca = my_soma_total - gaus(qtd)
	saida[len(saida) - 1] += diferenca
	complemento = n // my_soma_total
	[print(int(e * complemento), end=' ') for e in saida]


import math
import sys
array = list(map(int, input().split()))
n = array[0]
k = array[1]
maxi = -1
for i in range(1, int(math.sqrt(n)) + 1):
	if n % i != 0:
		continue
	del1 = int(i)
	del2 = int(n / i)
	sum1 = del1 * k * (k - 1) / 2
	sum2 = del2 * k * (k - 1) / 2
	if n - sum1 > (k - 1) * del1:
		maxi = max(maxi, del1)
	if n - sum2 > (k - 1) * del2:
		maxi = max(maxi, del2)
if maxi == -1:
	print(-1)
	sys.exit()
sum = 0
ans = []
for i in range(1, k):
	ans.append(i * maxi)
	sum += i * maxi
ans.append(n - sum)
print(' '.join(map(str, ans)))


(n, a) = map(int, input().split())
if a * (a + 1) / 2 > n:
	print(-1)
	exit(0)
c = a * (a + 1) / 2
res = 1
q = int((n + 10) ** (1 / 2))
for i in range(1, q + 10):
	if n % i:
		continue
	if c * i > n:
		continue
	i1 = n // i
	if i1 * c <= n:
		res = max(res, i1)
	res = max(res, i)
res = int(res)
s1 = 0
for i in range(a - 1):
	print((i + 1) * res, end=' ')
	s1 += (i + 1) * res
print(n - s1)


(n, k) = map(int, input().split(' '))
l = []
i = 1
while i * i <= n:
	if n % i == 0:
		l.append(i)
		l.append(n // i)
	i = i + 1
l.sort()
c = 0
for i in range(len(l) - 1, -1, -1):
	m = (1 + k) / 2 * k
	if m <= n // l[i]:
		for j in range(1, k):
			print(j * l[i], end=' ')
		print(int(n // l[i] - m + k) * l[i])
		c = 1
		break
if c == 0:
	print(-1)


from collections import deque
from math import sqrt
(n, k) = map(int, input().split())
sum_k = k * (k + 1) / 2
if sum_k > n:
	print(-1)
else:
	pos = deque()
	for x in range(int(sqrt(n)), 0, -1):
		if n % x == 0:
			pos.appendleft(x)
			if x * x != n:
				pos.append(int(n / x))
	it = -1
	count = len(pos)
	first = 0
	while count > 0:
		it = first
		step = count // 2
		it += step
		if pos[it] < sum_k:
			it += 1
			first = it
			count -= step + 1
		else:
			count = step
	curr = n / pos[first]
	for x in range(1, k):
		print('%d ' % (curr * x), end='')
	rem = n - k * (k - 1) / 2 * curr
	print('%d' % rem)


def f(k):
	return k * (k + 1) // 2

def solve():
	max_ = -1
	plus = 0
	ans = None
	for d in div:
		remain = n // d
		add = remain - f(k)
		if add >= 0 and max_ < d:
			max_ = d
			plus = add
	if max_ > 0:
		ans = list(range(1, k + 1))
		ans[-1] += plus
	return (max_, ans)
(n, k) = map(int, input().split())
div = []
i = 1
while i * i <= n:
	if n % i == 0:
		div.append(i)
		if i != n // i:
			div.append(n // i)
	i += 1
(max_, ans) = solve()
if max_ > 0:
	print(' '.join([str(x * max_) for x in ans]))
else:
	print(max_)


(n, k) = [int(x) for x in input().split()]
divisors = {1, n}
for i in range(2, n):
	if i * i > n:
		break
	if n % i == 0:
		divisors.add(i)
		divisors.add(n // i)
divisors = list(divisors)
divisors.sort()
divisors.reverse()
base = k * (1 + k)
base = base // 2
done = False
for d in divisors:
	if base * d <= n:
		res = [d * i for i in range(1, k + 1)]
		res[k - 1] += n - sum(res)
		print(*res)
		done = True
		break
if not done:
	print(-1)


from sys import *
(n, k) = input().split()
n = int(n)
k = int(k)
kk = (1 + k) * k // 2
if n < kk:
	print(-1)
	exit(0)

def ans(g):
	if n < g * kk:
		return
	r = n - kk * g
	for _ in range(1, k):
		print(_ * g, end=' ')
	print(k * g + r)
	exit(0)
for d in range(1, 200000):
	if n % d == 0:
		ans(n // d)
for d in range(200000, 0, -1):
	if n % d == 0:
		ans(d)


(n, k) = list(map(int, input().split()))
d = k * (k + 1) // 2
if n < d:
	print(-1)
else:
	u = 1
	for j in range(1, int(n ** 0.5) + 2):
		if n % j == 0:
			jj = n // j
			if j >= d and jj > u:
				u = jj
			elif jj >= d and j > u:
				u = j
	res = [u * i for i in range(1, k)]
	res.append(n - sum(res))
	print(*res)


N_ = 10000000001
SQN_ = 100001
(n, k) = map(int, input().split())
mxg = 1

def ul(k):
	return k * (k + 1) // 2
if n < ul(k):
	print(-1)
else:
	for g in range(1, SQN_):
		if g <= n and n % g == 0 and (n // g >= ul(k)):
			mxg = max(mxg, g)
		if g <= n and n % g == 0 and (g >= ul(k)):
			mxg = max(mxg, n // g)
	a = []
	for i in range(1, k + 1):
		a.append(mxg * i)
	a[-1] += n - mxg * ul(k)
	print(' '.join(map(str, a)))


def main():
	(n, k) = map(int, input().split())
	tot = k * (k + 1) // 2
	if tot > n:
		print(-1)
		return
	best = 1
	for d in range(2, n):
		if d * d > n:
			break
		if n % d == 0:
			if tot * d <= n:
				best = max(best, d)
			nd = n // d
			if tot * nd <= n:
				best = max(best, nd)
	res = [i * best for i in range(1, k + 1)]
	assert sum(res) == tot * best
	res[-1] = n - sum(res[:-1])
	print(' '.join((str(x) for x in res)))
main()


(n, k) = [int(x) for x in input().split()]
if k > 1000000.0:
	print(-1)
	exit(0)
ind = -1
uwu = -1
for i in range(1, n + 1):
	if i * i > n:
		break
	if n % i == 0:
		a1 = i
		anmin1 = a1 * (k - 1)
		an = n - (a1 + anmin1) * (k - 1) // 2
		if an > anmin1:
			ind = i
			uwu = an
		a1 = n / i
		anmin1 = a1 * (k - 1)
		an = n - (a1 + anmin1) * (k - 1) // 2
		if an > anmin1:
			ind = n // i
			uwu = an
			break
if ind == -1:
	print(-1)
	exit(0)
first = ind
for i in range(k - 1):
	print(first, end=' ')
	first += ind
print(int(uwu))


from math import sqrt
(n, k) = list(map(int, input().split()))

def f(s):
	for v in range(1, 1 + int(sqrt(n))):
		if n % v == 0:
			yield v
			yield (n // v)
s = k * (k + 1) // 2
v = set((x for x in f(s) if x <= n // s))
if v:
	gcd = max(v)
	print(*list(range(gcd, gcd * k, gcd)), n - gcd * (k - 1) * k // 2)
else:
	print(-1)


(n, k) = map(int, input().split())
if n < k * (k + 1) // 2:
	print(-1)
else:
	drd = 1
	for d in range(1, int(n ** 0.5) + 1):
		if n % d == 0:
			x = n // d
			if x >= k * (k + 1) // 2:
				drd = max(d, drd)
			if d >= k * (k + 1) // 2:
				drd = max(n // d, drd)
	ans = []
	x = n // drd
	x -= k * (k - 1) // 2
	for i in range(1, k):
		ans.append(i * drd)
	ans.append(x * drd)
	print(*ans)


import math
(n, k) = map(int, input().split())
s = k * (k + 1) // 2
if s > n:
	print(-1)
else:
	mx = 0
	i = 1
	while i <= math.sqrt(n):
		if n % i == 0:
			if i * s <= n:
				mx = i
			x = n / i
			if x * s <= n:
				c = 1
				tot = 0
				count = 0
				while count < k:
					if count == k - 1:
						print(int(n - tot))
						quit()
					tot += c * x
					print(int(x * c), end=' ')
					c += 1
					count += 1
		i += 1
	c = 1
	tot = 0
	count = 0
	while count < k:
		if count == k - 1:
			print(int(n - tot))
			quit()
		tot += c * mx
		print(int(mx * c), end=' ')
		c += 1
		count += 1


def solve():
	(n, k) = [int(x) for x in input().split(' ')]
	x = n // (k * (k + 1) // 2)
	r = 1
	i = 2
	while i * i <= n:
		if n % i == 0:
			if i <= x:
				r = max(i, r)
			if n // i <= x:
				r = max(n // i, r)
		i += 1
	if n <= x:
		r = n
	if n < k * (k + 1) // 2:
		return [-1]
	else:
		y = [r * i for i in range(1, k + 1)]
		y[-1] += n - sum(y)
		return y
print(*solve())


import math

def solve(n, k, kk):
	if kk > n:
		print(-1)
		return
	lim = int(math.sqrt(n) + 2)
	divs = []
	for i in range(1, lim + 1):
		if n % i == 0:
			divs.append(int(n / i))
			if i * i != n:
				divs.append(i)
	divs.sort()
	siz = len(divs)
	biggest = 1
	k2 = int(k * (k - 1) / 2)
	for i in range(0, siz):
		last = n - divs[i] * k2
		if last > divs[i] * (k - 1):
			biggest = max(divs[i], biggest)
	for i in range(1, k):
		print(biggest * i, end=' ')
	print(n - biggest * k2)
(n, k) = map(int, input().split())
kk = k * (k + 1) >> 1
solve(n, k, kk)


import sys
import math

def main():
	(n, k) = map(int, input().split())
	base = int(k * (k + 1) / 2)
	if n < base:
		print('-1')
		return
	closest = None
	for i in range(base, int(math.sqrt(n))):
		if n % i == 0:
			closest = i
			break
	if closest is None:
		for i in range(int(math.sqrt(n) + 1), 0, -1):
			if n % i == 0 and base <= n / i:
				closest = n / i
				break
	multiplier = int(n / closest)
	for i in range(1, k):
		print(i * multiplier, end=' ')
	print(int((k + closest - base) * multiplier))

def __starting_point():
	main()
__starting_point()


(n, k) = input().split()
(n, k) = (int(n), int(k))
g = -1

def go(x, y):
	if y * (y + 1) > 2 * x:
		return False
	return True
for i in range(1, n + 1):
	if i * i > n:
		break
	if n % i == 0:
		if go(i, k) and g < n // i:
			g = n // i
		if go(n // i, k) and g < i:
			g = i
if g == -1:
	print(g)
else:
	suma = n
	for i in range(1, k):
		print(i * g, end=' ')
		suma -= i * g
	print(suma)


(n, k) = list(map(int, input().strip().split(' ')))
L = n // k
import bisect

def div(n):
	if n == 1:
		return [1]
	elif n == 2:
		return [1, 2]
	else:
		K = int(n ** 0.5)
		temp1 = []
		temp2 = []
		for i in range(1, K + 1):
			if n % i == 0:
				temp1 += [i]
				temp2 += [n // i]
		if temp1[-1] == temp2[-1]:
			temp2 = temp2[1:]
		ans = temp1 + temp2[::-1]
		return ans
if k * (k + 1) // 2 > n:
	print(-1)
else:
	TTT = div(n)
	temp = k * (k + 1) // 2
	L = n // temp
	K = bisect.bisect_right(TTT, L) - 1
	L = TTT[K]
	T = (n - temp * L) // L
	ans = []
	for i in range(1, k + 1):
		if i != k:
			ans += [i * L]
		else:
			ans += [(i + T) * L]
	if k == 1:
		print(n)
	else:
		print(*ans)


import math
(n, k) = [int(x) for x in input().split()]
mmx = k * (k + 1) // 2
if mmx > n:
	print(-1)
else:
	mx = 1
	for i in range(2, int(math.sqrt(n)) + 1):
		if n % i == 0:
			l = i
			r = n // i
			if mmx <= l:
				mx = max(mx, n // i)
			if mmx <= r:
				mx = max(mx, i)
	sm = 0
	for i in range(1, k):
		print(i * mx, end=' ')
		sm = sm + i * mx
	sm = n - sm
	print(sm)


(n, k) = map(int, input().split())
m = (1 + k) * k // 2
if n < m:
	print(-1)
	exit(0)

def ans(g):
	if n < g * m:
		return
	r = n - m * g
	for _ in range(1, k):
		print(_ * g, end=' ')
	print(k * g + r)
	exit(0)
for d in range(1, 200000):
	if n % d == 0:
		ans(n // d)
for d in range(200000, 0, -1):
	if n % d == 0:
		ans(d)


import sys

def get_primes(n: int):
	from itertools import chain
	from array import array
	primes = {2, 3}
	is_prime = array('b', (0, 0, 1, 1, 0, 1, 0)) + array('b', (1, 0, 0, 0, 1, 0)) * ((n - 1) // 6)
	for i in chain.from_iterable((range(5, n + 1, 6), range(7, n + 1, 6))):
		if is_prime[i]:
			primes.add(i)
			for j in range(i * 3, n + 1, i * 2):
				is_prime[j] = 0
	return (is_prime, primes)
(n, k) = map(int, input().split())
if n == 1:
	print(1 if k == 1 else -1)
	exit()
if k == 1:
	print(n)
	exit()
if k * (k + 1) // 2 > n:
	print(-1)
	exit()
(_, primes) = get_primes(10 ** 5)
divisors = set()
m = n
for i in range(1, 10 ** 5 + 1):
	if n % i == 0:
		divisors.add(i)
		divisors.add(n // i)
tri = k * (k + 1) // 2
for d in sorted(divisors, reverse=True):
	if n >= d * tri and (n - d * tri) % d == 0:
		rem = n - k * (k - 1) // 2 * d
		ans = list((i * d for i in range(1, k))) + [rem]
		assert ans[-2] < ans[-1]
		print(*ans)
		exit()


import sys
(n, k) = map(int, input().split(' '))
if k * (k + 1) // 2 > n:
	print(-1)
	sys.exit()
g = 1
ans = 1
while g * g <= n:
	if n % g == 0:
		s = (k - 1) * k * g // 2
		if n - s > (k - 1) * g and (n - s) % g == 0:
			ans = max(ans, g)
		s = (k - 1) * k * (n // g) // 2
		if n - s > (k - 1) * (n // g) and (n - s) % (n // g) == 0:
			ans = max(ans, n // g)
	g += 1
s = 0
for i in range(1, k):
	print(i * ans, end=' ')
	s += i * ans
print(n - s)


import bisect
from itertools import accumulate
import os
import sys
import math
from decimal import *
from io import BytesIO, IOBase
BUFSIZE = 8192

class FastIO(IOBase):
	newlines = 0

	def __init__(self, file):
		self._fd = file.fileno()
		self.buffer = BytesIO()
		self.writable = 'x' in file.mode or 'r' not in file.mode
		self.write = self.buffer.write if self.writable else None

	def read(self):
		while True:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			if not b:
				break
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines = 0
		return self.buffer.read()

	def readline(self):
		while self.newlines == 0:
			b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
			self.newlines = b.count(b'\n') + (not b)
			ptr = self.buffer.tell()
			(self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
		self.newlines -= 1
		return self.buffer.readline()

	def flush(self):
		if self.writable:
			os.write(self._fd, self.buffer.getvalue())
			(self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

	def __init__(self, file):
		self.buffer = FastIO(file)
		self.flush = self.buffer.flush
		self.writable = self.buffer.writable
		self.write = lambda s: self.buffer.write(s.encode('ascii'))
		self.read = lambda : self.buffer.read().decode('ascii')
		self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))

def input():
	return sys.stdin.readline().rstrip('\r\n')

def isPrime(n):
	if n <= 1:
		return False
	if n <= 3:
		return True
	if n % 2 == 0 or n % 3 == 0:
		return False
	i = 5
	while i * i <= n:
		if n % i == 0 or n % (i + 2) == 0:
			return False
		i = i + 6
	return True

def SieveOfEratosthenes(n):
	prime = []
	primes = [True for i in range(n + 1)]
	p = 2
	while p * p <= n:
		if primes[p] == True:
			prime.append(p)
			for i in range(p * p, n + 1, p):
				primes[i] = False
		p += 1
	return prime

def primefactors(n):
	fac = []
	while n % 2 == 0:
		fac.append(2)
		n = n // 2
	for i in range(3, int(math.sqrt(n)) + 2):
		while n % i == 0:
			fac.append(i)
			n = n // i
	if n > 1:
		fac.append(n)
	return fac

def factors(n):
	fac = set()
	fac.add(1)
	fac.add(n)
	for i in range(2, int(math.sqrt(n)) + 1):
		if n % i == 0:
			fac.add(i)
			fac.add(n // i)
	return list(fac)

def modInverse(a, m):
	m0 = m
	y = 0
	x = 1
	if m == 1:
		return 0
	while a > 1:
		q = a // m
		t = m
		m = a % m
		a = t
		t = y
		y = x - q * y
		x = t
	if x < 0:
		x = x + m0
	return x
(n, k) = map(int, input().split(' '))
best = -1
s = (k + 1) * k // 2
for d in range(1, int(n ** 0.5) + 1):
	if d * s > n:
		break
	if n % d == 0:
		best = d
		if n // d * s <= n:
			best = n // d
			break
if best == -1:
	print(-1)
else:
	for i in range(1, k):
		print(best * i, end=' ')
	print(best * k + n - best * s)


def divisors_list(n):
	divisors = []
	divisors2 = []
	d = 2
	while d * d <= n and n > 1:
		if n % d == 0:
			divisors.append(d)
		d += 1
	if n > 1:
		divisors.append(n)
	for div in divisors:
		divisors2.append(n // div)
	merge = divisors + divisors2
	return merge
(n, k) = map(int, input().split())
if k == 1:
	print(n)
	exit()
arr = sorted(divisors_list(n))
arr.reverse()
for x in arr:
	rik = n // x
	if rik >= k * (k + 1) // 2:
		cnt = 0
		ans = []
		for y in range(1, k + 1):
			cnt += y
			ans.append(y)
		ans[-1] = ans[-1] + rik - cnt
		print(*[hah * x for hah in ans])
		exit()
	else:
		pass
print(-1)


import sys
from bisect import bisect_left as lb
from collections import deque
from queue import PriorityQueue as pq
from math import *
input_ = lambda : sys.stdin.readline().strip('\r\n')
ii = lambda : int(input_())
il = lambda : list(map(int, input_().split()))
ilf = lambda : list(map(float, input_().split()))
ip = lambda : input_()
fi = lambda : float(input_())
ap = lambda ab, bc, cd: ab[bc].append(cd)
li = lambda : list(input_())
pr = lambda x: print(x)
prinT = lambda x: print(x)
f = lambda : sys.stdout.flush()
inv = lambda x: pow(x, mod - 2, mod)
mod = 10 ** 9 + 7
(n, k) = il()
s = k * (k + 1) // 2
if s > n:
	print(-1)
	exit(0)
if s == n:
	for i in range(1, k + 1):
		print(i, end=' ')
	print()
	exit(0)
p = 1
a = []
while p * p <= n:
	if n % p == 0:
		a.append(p)
		if p * p != n:
			a.append(n // p)
	p += 1
a.sort()
ans = 0
for d in a:
	if n // d >= s:
		ans = d
	else:
		break
if ans:
	for i in range(1, k):
		print(i * ans, end=' ')
		n -= i * ans
	print(n)
else:
	print(-1)


import sys

def input():
	return sys.stdin.readline().rstrip()
DXY = [(0, -1), (1, 0), (0, 1), (-1, 0)]

def divisors(n: int):
	res = []
	for i in range(1, n + 1):
		if i * i > n:
			break
		if n % i == 0:
			if i * i == n:
				res.append(i)
			else:
				res.append(n // i)
				res.append(i)
	res.sort(reverse=True)
	return res

def main():
	(n, k) = map(int, input().split())
	for d in divisors(n):
		if n // d >= k * (k + 1) // 2:
			ans = [0] * k
			tot = n // d
			for i in range(k):
				if i != k - 1:
					ans[i] = (i + 1) * d
					tot -= i + 1
				else:
					ans[i] = tot * d
			print(*ans)
			return 0
	print(-1)
	return 0
main()